diff --git a/documentation/audits/DIAG-sharing-2026-07-20.md b/documentation/audits/DIAG-sharing-2026-07-20.md index 1affa4b..dcb63e2 100644 --- a/documentation/audits/DIAG-sharing-2026-07-20.md +++ b/documentation/audits/DIAG-sharing-2026-07-20.md @@ -218,7 +218,7 @@ starts with "which network am I actually on". |---|---|---|---|---|---| | **S-1** — **FIXED v0.151.0** | **HIGH** | `/sharing` reload-loops forever for every customer with sharing enabled — the page is unusable. `sharingStatusHandler` reports `running` as a level; the JS treats it as a one-shot success edge and calls `location.reload()`. | `sharing_handlers.go:246` (blame `b5d78d1`), `sharing.html` L320–326, 6× identical `phase:"running"` poll | **XS.** Make the JS reload only when it has *observed a transition* — latch a `sawInFlight` flag on the first tick and reload on `running` only if it is set; otherwise just paint the success alert and stop. Server-side alternative (also XS): report the coerced level as a distinct phase (`running_steady`) the JS renders but never reloads on. Prefer the JS latch — it keeps the honest "liveness wins" contract the handler comment states. **Needs a red-proof:** a template/JS test or handler test asserting a fresh page load with a live container does not schedule a reload. | no — plain bug fix | | **S-2** — **SHIPPED v0.151.0** | **MED** | The UI never tells the customer *where* to connect. `sharing.html` L32/L61 show only `\\FELHOM`; there is no IP anywhere on the page, so a customer who cannot resolve the name has nothing to fall back on and will guess (Viktor guessed the Proxmox host IP). | `sharing.html` L30–32, L61; symptom 1 itself | **S.** Render the guest's current LAN address beside the name: `\\FELHOM` *(vagy `smb://192.168.0.104`)*, sourced from the same place the dashboard already knows the guest IP. Add a one-line macOS hint (Finder → Ugrás → Csatlakozás a szerverhez). | no | -| **S-3** — **OPEN** | **MED** | No mDNS/Bonjour advertisement. `smbd + nmbd + wsdd` covers Windows (WSD) and legacy NetBIOS, but macOS Finder's preferred path is Bonjour — `FELHOM.local` does not resolve and the share never appears in the Finder sidebar. Likely the whole of symptom 1b. | nothing on udp/5353 (§ Phase A); container log daemon list; `infra/samba.go` header comment citing the R-6 spike | **S–M.** Add avahi-daemon (or `wsdd`'s mDNS sibling) to the felhom-samba image publishing `_smb._tcp`, host-net so multicast reaches the LAN. Re-runs the R-6 spike's constraint set — treat as a slice, not a hotfix. Confirm with the Mac matrix first (below) so we fix the mechanism that is actually failing. | yes — image change + republish | +| **S-3** — **FIXED v0.152.0 / samba 1.1.0** | **MED** | No mDNS/Bonjour advertisement. `smbd + nmbd + wsdd` covers Windows (WSD) and legacy NetBIOS, but macOS Finder's preferred path is Bonjour — `FELHOM.local` does not resolve and the share never appears in the Finder sidebar. Likely the whole of symptom 1b. | nothing on udp/5353 (§ Phase A); container log daemon list; `infra/samba.go` header comment citing the R-6 spike | **S–M.** Add avahi-daemon (or `wsdd`'s mDNS sibling) to the felhom-samba image publishing `_smb._tcp`, host-net so multicast reaches the LAN. Re-runs the R-6 spike's constraint set — treat as a slice, not a hotfix. Confirm with the Mac matrix first (below) so we fix the mechanism that is actually failing. | yes — image change + republish | | **S-4** — **CORE SHIPPED v0.151.0** | **LOW** | Success-state semantics: the ensure job's phase never returns to `idle` after a terminal phase, and `SambaRunning()` masks that anyway. Harmless today only because S-1's fix removes the consumer that cared. Worth folding into the **unified async-job feedback** roadmap item the `samba_ensure_job.go` header already names. | `samba_ensure_job.go` (no reset path); handler line 246 | Fold into the roadmap item; no standalone task. | no | | **S-5** — **SHIPPED v0.151.0** | **INFO** | The guest holds its LAN address by **DHCP** (`ip=dhcp`, lease ~54 min at probe). Any printed IP is not stable across a lease change or a site move, which weakens S-2 unless the page re-reads it live (it should — render it, never persist it). | `pct config 9201`; `valid_lft 3251sec` | Render live, never cache. Consider a DHCP reservation at the customer's router as a documented install step. | no | @@ -297,3 +297,82 @@ still is Viktor's to give — a browser is the one method not available here. **Tests:** 23/23 packages green (twice). Three red-proofs recorded — reinstating the coercion, deleting the serve-once clear, and memoizing the derived address each turned the corresponding test red, then were restored. + +--- + +## Addendum 2 — 2026-07-20, controller v0.152.0 + felhom-samba 1.1.0 (S-3 closed) + +### The finding that redirected the fix: macOS asks, is answered correctly, and ignores it + +Addendum 1 recorded S-3 as "no mDNS, and macOS probably no longer does NetBIOS". **The second half +was wrong**, and a packet capture on the box settled it. On a bare `smb://FELHOM` from the operator's +Mac (`192.168.0.11`): + +``` +11:18:30.222080 192.168.0.11.52844 > 192.168.0.255.137 UDP len 50 (NBNS query) + name = EGEFEMEIEPENCACACACACACACACACACA → "FELHOM" + 9 pad + suffix 0x20 + i.e. FELHOM<20>, the File Server Service suffix — exactly right for SMB +11:18:30.222220 192.168.0.104.137 > 192.168.0.11.52844 UDP len 62 (NBNS response, +140 µs) + flags 0x8580 → response, authoritative, RCODE=0 (no error), ANCOUNT=1 + TTL 259200, NB_FLAGS 0x0000 (unique, B-node), RDATA 192.168.0.104 +``` + +**A textbook-correct positive answer, delivered in 140 microseconds — and macOS never opened a TCP +connection.** It retried once at 11:18:30.718, was answered again, and gave up. Sixteen seconds +later, at 11:18:46, the same Mac queried `FELHOM.local` over mDNS and went straight to `445`. + +So NetBIOS on macOS feeds legacy browsing, not `smb://` URL resolution. **The bare `smb://` +cannot be made to work from a Mac by any change on our side**, and nmbd — the thing the R-6/S4b +spike was right to insist on — was never the broken part. It is exactly what serves Windows. + +Investigated and dismissed: the box answers **twice** per broadcast query, because nmbd holds +`0.0.0.0:137`, `192.168.0.104:137` and `192.168.0.255:137`, and a subnet broadcast is delivered to +two of them. That is standard Samba behaviour, and a duplicated correct answer is still a correct +answer that macOS declined to use. + +### The proven matrix + +| Client | Working form | Served by | +|---|---|---| +| Windows | `\\FELHOM` | nmbd (+ wsdd for the Network view) | +| macOS | **`smb://FELHOM.local`** | avahi/mDNS — new in samba 1.1.0 | +| Any | `smb://192.168.0.104` | direct | + +### Shipped + +* **felhom-samba 1.1.0** — avahi + dbus added. `avahi-daemon.conf` and the `_smb._tcp` service file + are templated from `FELHOM_SERVER_NAME` at entrypoint, so renaming the server re-advertises under + the new name. Static service file rather than smbd's `multicast dns register`, because `smb.conf` + is bind-mounted READ-ONLY and owned by the controller's renderer — and it allows publishing + `_device-info._tcp` too. Both daemons are **non-fatal on failure**: a discovery gap must not turn + into a sharing outage. +* **controller v0.152.0** — the connect card's Mac line was `smb://`, i.e. the one form that + provably cannot work. Now `smb://.local`. The Windows line stays the flat `\\`. This was + a **copy defect introduced by v0.151.0 the same day**, not merely a missing feature. + +### Live validation (endpoint-level + on-the-wire from a second machine) + +``` +mDNS from felhom-pve (shipped image, not the spike): + FELHOM.local (A) -> A 192.168.0.104 (from 192.168.0.104) + _smb._tcp (browse) -> PTR FELHOM._smb._tcp.local (from 192.168.0.104) + +daemons in felhom-samba:1.1.0: smbd · nmbd · wsdd · dbus-daemon · avahi-daemon: running [FELHOM.local] + +GET /sharing -> smb://FELHOM.local smb://192.168.0.104 \\FELHOM +GET /sharing/status x2 -> phase:"idle", running:true (v0.151.0 contract still holding) +``` + +Operator confirmation from the Mac: **`smb://FELHOM.local` connects and prompts for credentials.** +(Username is `felhom`, the household account — the Mac prefills the local account name, which will +be rejected.) + +### STILL OPEN — Finder-sidebar discovery + +**Not claimed as shipped.** The `_smb._tcp` record is published and answers browse queries on the +wire, but FELHOM did **not** appear in the operator's Finder sidebar. That Finder window showed no +Network/Bonjour section at all, which points at **Finder Settings → Sidebar → Locations** rather +than at the box — but it is unverified either way, so it stays open. Next step is one look at that +setting, and `dns-sd -B _smb._tcp` on the Mac to confirm the advert is seen client-side. Zero-typing +discovery was the original ambition of the R-6 spike and is still not demonstrated. +