From c131603f0dbfb60737dd159d26041f0fa61b4d0b Mon Sep 17 00:00:00 2001 From: enricobuehler Date: Sun, 19 Jul 2026 10:17:36 +0200 Subject: [PATCH] fix(apple): point pairing copy at the web console's real port (47992, HTTPS) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Every pairing surface in the Apple client still told users to open the web console on port 3000 — the pre-move port. The console has served :47992 for a long time, so anyone following the on-screen instructions hit a dead port and had no way to approve the device or read the PIN. Seven strings across ContentView, SessionModel and PairSheet (iOS/tvOS/macOS share them). The two that spell out a full URL also said `http://`; the console is HTTPS-only (host's self-signed cert), so they now read `https://:47992`, matching the phrasing in the host README, install docs and the deb/rpm packaging notes. Copy-only — no behavioural change; a repo-wide sweep found no other stale :3000. Co-Authored-By: Claude Opus 4.8 --- clients/apple/Sources/PunktfunkClient/ContentView.swift | 4 ++-- .../Sources/PunktfunkClient/Session/SessionModel.swift | 2 +- .../apple/Sources/PunktfunkClient/Trust/PairSheet.swift | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/clients/apple/Sources/PunktfunkClient/ContentView.swift b/clients/apple/Sources/PunktfunkClient/ContentView.swift index 5c0f27e7..f2da190f 100644 --- a/clients/apple/Sources/PunktfunkClient/ContentView.swift +++ b/clients/apple/Sources/PunktfunkClient/ContentView.swift @@ -292,7 +292,7 @@ struct ContentView: View { Button("Cancel", role: .cancel) {} } message: { req in Text("\(req.host.displayName) requires pairing. Request access and approve this " - + "device in the host's web console (port 3000 → Pairing) — no PIN needed. Or " + + "device in the host's web console (port 47992 → Pairing) — no PIN needed. Or " + "pair with the 4-digit PIN it can display.") } // One "Connection failed" surface for every home screen (touch grid, gamepad launcher) and @@ -335,7 +335,7 @@ struct ContentView: View { Button("Cancel", role: .cancel) { model.disconnect() } } message: { req in Text("Approve \u{201C}\(localDeviceName)\u{201D} in \(req.host.displayName)'s web " - + "console (port 3000 → Pairing). This device connects automatically once you " + + "console (port 47992 → Pairing). This device connects automatically once you " + "approve it — no need to reconnect.") } // Informational deep-link outcome (unknown host / already streaming). Not an error. diff --git a/clients/apple/Sources/PunktfunkClient/Session/SessionModel.swift b/clients/apple/Sources/PunktfunkClient/Session/SessionModel.swift index 9ed343a9..f03c8e22 100644 --- a/clients/apple/Sources/PunktfunkClient/Session/SessionModel.swift +++ b/clients/apple/Sources/PunktfunkClient/Session/SessionModel.swift @@ -338,7 +338,7 @@ final class SessionModel: ObservableObject { // operator didn't approve it before the host's park window elapsed (or // the host was unreachable). self.errorMessage = "\(host.displayName) didn't let this device in. " - + "Approve it in the host's web console (port 3000 → Pairing), then " + + "Approve it in the host's web console (port 47992 → Pairing), then " + "request access again — the request expires after a few minutes." } else { self.errorMessage = pin != nil diff --git a/clients/apple/Sources/PunktfunkClient/Trust/PairSheet.swift b/clients/apple/Sources/PunktfunkClient/Trust/PairSheet.swift index 6cf8a40a..5d1b812c 100644 --- a/clients/apple/Sources/PunktfunkClient/Trust/PairSheet.swift +++ b/clients/apple/Sources/PunktfunkClient/Trust/PairSheet.swift @@ -1,4 +1,4 @@ -// PIN pairing sheet. The host shows the pairing PIN in its web console (port 3000 → +// PIN pairing sheet. The host shows the pairing PIN in its web console (port 47992 → // Pairing; also printed in the host's log when armed via --allow-pairing); the user // types it here. The ceremony is SPAKE2, so a wrong PIN buys an // attacker exactly one online guess — for the user a typo just means "try again" (the @@ -45,7 +45,7 @@ struct PairSheet: View { #if os(tvOS) VStack(spacing: 24) { Text("The PIN is shown in the host's web console " - + "(http://:3000 → Pairing). " + + "(https://:47992 → Pairing). " + "Pairing verifies both sides at once — no fingerprint comparison " + "needed.") .font(.geist(22, relativeTo: .callout)) // TV-legible (system callout is ~25 there) @@ -118,7 +118,7 @@ struct PairSheet: View { .foregroundStyle(.tint) } footer: { Text("The PIN is shown in the host's web console " - + "(http://:3000 → Pairing). " + + "(https://:47992 → Pairing). " + "Pairing verifies both sides at once — no fingerprint " + "comparison needed.") .font(.geist(12, relativeTo: .caption)) @@ -210,7 +210,7 @@ struct PairSheet: View { onPaired(fingerprint) dismiss() case .failure(PunktfunkClientError.wrongPIN): - errorText = "Wrong PIN — check the host's web console (port 3000) " + errorText = "Wrong PIN — check the host's web console (port 47992) " + "and try again." case .failure(PunktfunkClientError.rejected(let rejection)): // The host answered and said why (not armed / rate-limited / armed for