From 4f398c7803f1dd96e2394f43a539fd7dc0724f33 Mon Sep 17 00:00:00 2001 From: Andrew Chen Date: Thu, 3 Sep 2026 20:59:50 -0700 Subject: [PATCH 1/2] Upgrade iroh to 1.1.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit iroh 1.0.3 -> 1.1.0 and iroh-mdns-address-lookup 0.4.0 -> 0.5.0 (the release built against iroh 1.1). No source changes were needed: 1.1.0's one breaking item is CustomAddr serialization, which sits behind unstable-custom-transports and is unused here. The rest is internal — relay metrics, rate-limit notifications, priority messages answered during relay reconnect backoff, DNS bound on both stacks, net-report HTTP probes honoring proxies. The relay-watchdog rationale in docs/architecture.md pinned the home-relay-loss bug to "iroh (v1.0.3)". Reworded to read as an observation on 1.0.3 that 1.1.0 does not claim to fix, so the watchdog stays. Also mark Backend::Keychain expect(dead_code) off macOS/Windows. It is only constructed under those two cfgs, so on a Linux host with the GTK dev libraries present -D warnings rejected the variant and `cargo clippy --workspace` could not run there at all. CI is unaffected: Linux excludes flextunnel-desktop, and the attribute is not emitted on the platforms that do build it. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01GiJ6hv634BUmnEBWLk42fz --- Cargo.lock | 138 +++++++++++++++++------- Cargo.toml | 4 +- crates/flextunnel-desktop/src/config.rs | 4 + docs/architecture.md | 11 +- 4 files changed, 113 insertions(+), 44 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7e324eb..7d09d83 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1452,7 +1452,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccc2776f0c61eca1ca32528f85548abd1a4be8fb53d1b21c013e4f18da1e7090" dependencies = [ "data-encoding", - "syn 1.0.109", + "syn 2.0.118", ] [[package]] @@ -3351,9 +3351,9 @@ checksum = "cf370abdafd54d13e54a620e8c3e1145f28e46cc9d704bc6d94414559df41763" [[package]] name = "iroh" -version = "1.0.3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "460de6bc52163b41b1646931f2897e5ab986f0966ade444467fec25024751a72" +checksum = "329552fad4e46b5ccb4439d5635216f6289eec2c46f3fde4bc732d762694b9e5" dependencies = [ "backon", "blake3", @@ -3402,9 +3402,9 @@ dependencies = [ [[package]] name = "iroh-base" -version = "1.0.3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6be73e16ee21c923aca9b3121aaa0db936f7c7ecc156ff47b8dac944c68d59a8" +checksum = "3ccf4cde68a02ef03c0095ab2c031c6adfe508f3bc8e7c258558a027ebe64a8e" dependencies = [ "curve25519-dalek", "data-encoding", @@ -3421,9 +3421,9 @@ dependencies = [ [[package]] name = "iroh-dns" -version = "1.0.3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46f6a9b39d18e6345f5c151afd299f2488e2cb5c520fe41b107b6bd3dc4c3349" +checksum = "9a41224eb0140a5c519935d4073fc6b236d174080be401f9bf7da126b2ee3aa4" dependencies = [ "arc-swap", "cfg_aliases", @@ -3445,9 +3445,9 @@ dependencies = [ [[package]] name = "iroh-mdns-address-lookup" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c1f941695731bc3999d8c13d7e94d50e229427da81ac957eec3818264f17559" +checksum = "cad3dfcaddd5c3681bf0a42606498fc6e8891de793408dfbc46a9fbe76f370b3" dependencies = [ "data-encoding", "derive_more", @@ -3492,9 +3492,9 @@ dependencies = [ [[package]] name = "iroh-relay" -version = "1.0.3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24bd586cf927f7b700f56ec3639b53cb5fa901ce284784051ff71092bfbf8193" +checksum = "1b5f6f07e2c9b0c4bc82e2864be09f4aea4320165d5316e668616dbc822f428a" dependencies = [ "blake3", "bytes", @@ -4233,9 +4233,9 @@ dependencies = [ "libc", "mac-addr", "ndk-context", - "netlink-packet-core", - "netlink-packet-route", - "netlink-sys", + "netlink-packet-core 0.8.1", + "netlink-packet-route 0.31.0", + "netlink-sys 0.8.8", "objc2 0.6.4", "objc2-core-foundation", "objc2-core-wlan", @@ -4246,6 +4246,30 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "netdev" +version = "0.46.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4db4135b187ddae3b6813c4f9d9ac9d5181859fa6a08b4e006c63a130974ed62" +dependencies = [ + "block2 0.6.2", + "dispatch2", + "dlopen2", + "ipnet", + "jni 0.21.1", + "libc", + "mac-addr", + "ndk-context", + "netlink-packet-core 0.9.0", + "netlink-packet-route 0.33.0", + "netlink-sys 0.9.0", + "objc2-core-foundation", + "objc2-system-configuration", + "once_cell", + "plist", + "windows-sys 0.61.2", +] + [[package]] name = "netlink-packet-core" version = "0.8.1" @@ -4255,6 +4279,12 @@ dependencies = [ "paste", ] +[[package]] +name = "netlink-packet-core" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d6e2daf9a8c2e21302714706860a0e6be02e03d17294ecc66b354ea7d4059dd" + [[package]] name = "netlink-packet-route" version = "0.31.0" @@ -4264,7 +4294,20 @@ dependencies = [ "bitflags 2.13.0", "libc", "log", - "netlink-packet-core", + "netlink-packet-core 0.8.1", +] + +[[package]] +name = "netlink-packet-route" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59d48ffc8b73a506e1ff0878528c72668f2bfbc3d875b6be890a96be5d0d5576" +dependencies = [ + "bitflags 2.13.0", + "libc", + "log", + "netlink-packet-core 0.9.0", + "zerocopy", ] [[package]] @@ -4276,8 +4319,8 @@ dependencies = [ "bytes", "futures", "log", - "netlink-packet-core", - "netlink-sys", + "netlink-packet-core 0.8.1", + "netlink-sys 0.8.8", "thiserror 2.0.18", ] @@ -4294,11 +4337,22 @@ dependencies = [ "tokio", ] +[[package]] +name = "netlink-sys" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c99d38e00b420df49e940fe0826e667c3dad82ac68eb4c2bbf754c1c14a83a10" +dependencies = [ + "bytes", + "libc", + "log", +] + [[package]] name = "netwatch" -version = "0.19.1" +version = "0.19.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d9cbe01741347ef750d743d6690603f5eed8341e679fb51c8e629337aa11976" +checksum = "39da9cad5f23aa43401f09497d3b280e51b5feba115d9ffbf38ca35d6ff95e96" dependencies = [ "atomic-waker", "bytes", @@ -4310,11 +4364,12 @@ dependencies = [ "n0-error", "n0-future", "n0-watcher", - "netdev", - "netlink-packet-core", - "netlink-packet-route", + "netdev 0.45.0", + "netdev 0.46.2", + "netlink-packet-core 0.8.1", + "netlink-packet-route 0.31.0", "netlink-proto", - "netlink-sys", + "netlink-sys 0.8.8", "noq-udp", "objc2-core-foundation", "objc2-system-configuration", @@ -4356,9 +4411,9 @@ dependencies = [ [[package]] name = "noq" -version = "1.1.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09e4bb6601fa543c110d8957813267d5a8d775a0f8fbaccf1f615d06ba9b10da" +checksum = "f1e6c57353d26be91a242f0ec96073066c4481a03f6be874daafb18902394515" dependencies = [ "bytes", "cfg_aliases", @@ -4378,9 +4433,9 @@ dependencies = [ [[package]] name = "noq-proto" -version = "1.1.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baa7b5ccd819a9c68a0d955e67a881032d09b1a17219b1f90b0997a0888e1a15" +checksum = "9a46813e306c29c4f86357b6ffa39a8e1c97bb274b9a296a19a56d62e4111225" dependencies = [ "aes-gcm", "bytes", @@ -4405,9 +4460,9 @@ dependencies = [ [[package]] name = "noq-udp" -version = "1.1.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02bba20e097a5a16cd0ad14ec882fae1e80a092a124e9422fc4dddd92e96a647" +checksum = "b56d621ed2c1773b5356ab39cc68c819f8d0103f7493d8661c4a5f5f8ea55f40" dependencies = [ "cfg_aliases", "libc", @@ -5254,13 +5309,13 @@ checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" [[package]] name = "plist" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "092791278e026273c1b65bbdcfbba3a300f2994c896bd01ab01da613c29c46f1" +checksum = "7da1d65da6dd5d1e44199ac0f58712d241c0f439f80adea8924d832384087f85" dependencies = [ "base64", "indexmap", - "quick-xml", + "quick-xml 0.41.0", "serde", "time", ] @@ -5343,9 +5398,9 @@ dependencies = [ [[package]] name = "portmapper" -version = "0.19.1" +version = "0.19.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb3713e4977408279158444a18c1a01ac9bf2e7eaf1fbfd1a19ac9cd18d90721" +checksum = "ca97242f016e090a25330613bc2382aab65eb22f9149dbe84d8f8e711d49a530" dependencies = [ "base64", "bytes", @@ -5546,6 +5601,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "quick-xml" +version = "0.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e660451e55124f798a69a5af3f49ccfbefbd41910eefd25caf2393e1f3473ec1" +dependencies = [ + "memchr", +] + [[package]] name = "quote" version = "1.0.46" @@ -6367,9 +6431,9 @@ checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" [[package]] name = "simple-dns" -version = "0.11.3" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a75cbde1bf934313596a004973e462f9a82caa814dcf1a5f507bdf51597eeb4" +checksum = "2b6f884fa9a8d48101774bfbd3aeb81e968dd22cffd19a372da69f183db22c1a" dependencies = [ "bitflags 2.13.0", ] @@ -7744,7 +7808,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c324a910fd86ebdc364a3e61ec1f11737d3b1d6c273c0239ee8ff4bc0d24b4a" dependencies = [ "proc-macro2", - "quick-xml", + "quick-xml 0.39.4", "quote", ] diff --git a/Cargo.toml b/Cargo.toml index d616069..c30155c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -28,8 +28,8 @@ flexaccess-keys = { git = "https://github.com/flexaccessdev/flexaccess-keys", ta futures = "0.3" ipnetwork = "0.21" hickory-resolver = { version = "0.26", default-features = false, features = ["tokio"] } -iroh = "1.0.3" -iroh-mdns-address-lookup = "0.4.0" +iroh = "1.1.0" +iroh-mdns-address-lookup = "0.5.0" libc = "0.2" log = "0.4" n0-future = "0.3" diff --git a/crates/flextunnel-desktop/src/config.rs b/crates/flextunnel-desktop/src/config.rs index 3a402c7..5f17ecb 100644 --- a/crates/flextunnel-desktop/src/config.rs +++ b/crates/flextunnel-desktop/src/config.rs @@ -50,6 +50,10 @@ const DEV_CONFIG_ENV: &str = "FLEXTUNNEL_DEV_CONFIG"; /// `profiles.json` with its secrets sealed under the Safe Storage master key /// held by the platform keychain via `keyring-core`. enum Backend { + /// Only ever built on macOS/Windows (see `init_store`); on any other host + /// the dev file path is the only reachable one, so the variant is dead + /// there and `-D warnings` would reject it. + #[cfg_attr(not(any(target_os = "macos", windows)), expect(dead_code))] Keychain, File(PathBuf), } diff --git a/docs/architecture.md b/docs/architecture.md index 4e4fca1..7ab176b 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -251,11 +251,12 @@ Implemented in `transport/relay_watchdog.rs`, driven by the serve loop in the CLI's `run_server`. A custom-relay server is dialable from off the LAN only while it is **registered on its home relay** (n0 discovery is off; clients dial by relay hint, and a relay forwards Initials only to endpoints connected to it). -iroh (v1.0.3) has been observed to silently lose its home relay for good after -a routine relay reconnect: no dial retries, no warnings, no registration on -any relay — the server stops being reachable through the relays until the -process restarts, while LAN clients that find it over mDNS keep working and -hide the outage (the mac desktop reconnects, the iOS app times out). +iroh has been seen to silently lose its home relay for good after a routine +relay reconnect: no dial retries, no warnings, no registration on any relay — +the server stops being reachable through the relays until the process restarts, +while LAN clients that find it over mDNS keep working and hide the outage (the +mac desktop reconnects, the iOS app times out). Observed on v1.0.3; no fix for +it is called out through v1.1.0, so the watchdog stays. The watchdog observes `Endpoint::home_relay_status()` and escalates like the client's reconnect loop: From 8a09dafb38392d627da27ef3d130cef3260cc158 Mon Sep 17 00:00:00 2001 From: Andrew Chen Date: Thu, 3 Sep 2026 21:08:38 -0700 Subject: [PATCH 2/2] Bump version to 0.0.71 for flextunnel packages --- Cargo.lock | 8 ++++---- Cargo.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7d09d83..5e350cc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1929,7 +1929,7 @@ dependencies = [ [[package]] name = "flextunnel-cli" -version = "0.0.70" +version = "0.0.71" dependencies = [ "anyhow", "clap", @@ -1945,7 +1945,7 @@ dependencies = [ [[package]] name = "flextunnel-core" -version = "0.0.70" +version = "0.0.71" dependencies = [ "anyhow", "askama", @@ -1977,7 +1977,7 @@ dependencies = [ [[package]] name = "flextunnel-desktop" -version = "0.0.70" +version = "0.0.71" dependencies = [ "aes-gcm", "anyhow", @@ -2006,7 +2006,7 @@ dependencies = [ [[package]] name = "flextunnel-ffi" -version = "0.0.70" +version = "0.0.71" dependencies = [ "flextunnel-core", "iroh", diff --git a/Cargo.toml b/Cargo.toml index c30155c..ca64865 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,7 +10,7 @@ default-members = [ ] [workspace.package] -version = "0.0.70" +version = "0.0.71" edition = "2024" description = "SOCKS5/HTTP-proxy-over-QUIC split tunnel via iroh P2P"