fix(apple): point pairing copy at the web console's real port (47992, HTTPS)
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://<host>: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 <noreply@anthropic.com>
This commit is contained in:
@@ -292,7 +292,7 @@ struct ContentView: View {
|
|||||||
Button("Cancel", role: .cancel) {}
|
Button("Cancel", role: .cancel) {}
|
||||||
} message: { req in
|
} message: { req in
|
||||||
Text("\(req.host.displayName) requires pairing. Request access and approve this "
|
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.")
|
+ "pair with the 4-digit PIN it can display.")
|
||||||
}
|
}
|
||||||
// One "Connection failed" surface for every home screen (touch grid, gamepad launcher) and
|
// 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() }
|
Button("Cancel", role: .cancel) { model.disconnect() }
|
||||||
} message: { req in
|
} message: { req in
|
||||||
Text("Approve \u{201C}\(localDeviceName)\u{201D} in \(req.host.displayName)'s web "
|
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.")
|
+ "approve it — no need to reconnect.")
|
||||||
}
|
}
|
||||||
// Informational deep-link outcome (unknown host / already streaming). Not an error.
|
// Informational deep-link outcome (unknown host / already streaming). Not an error.
|
||||||
|
|||||||
@@ -338,7 +338,7 @@ final class SessionModel: ObservableObject {
|
|||||||
// operator didn't approve it before the host's park window elapsed (or
|
// operator didn't approve it before the host's park window elapsed (or
|
||||||
// the host was unreachable).
|
// the host was unreachable).
|
||||||
self.errorMessage = "\(host.displayName) didn't let this device in. "
|
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."
|
+ "request access again — the request expires after a few minutes."
|
||||||
} else {
|
} else {
|
||||||
self.errorMessage = pin != nil
|
self.errorMessage = pin != nil
|
||||||
|
|||||||
@@ -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
|
// 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
|
// 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
|
// 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)
|
#if os(tvOS)
|
||||||
VStack(spacing: 24) {
|
VStack(spacing: 24) {
|
||||||
Text("The PIN is shown in the host's web console "
|
Text("The PIN is shown in the host's web console "
|
||||||
+ "(http://<host>:3000 → Pairing). "
|
+ "(https://<host>:47992 → Pairing). "
|
||||||
+ "Pairing verifies both sides at once — no fingerprint comparison "
|
+ "Pairing verifies both sides at once — no fingerprint comparison "
|
||||||
+ "needed.")
|
+ "needed.")
|
||||||
.font(.geist(22, relativeTo: .callout)) // TV-legible (system callout is ~25 there)
|
.font(.geist(22, relativeTo: .callout)) // TV-legible (system callout is ~25 there)
|
||||||
@@ -118,7 +118,7 @@ struct PairSheet: View {
|
|||||||
.foregroundStyle(.tint)
|
.foregroundStyle(.tint)
|
||||||
} footer: {
|
} footer: {
|
||||||
Text("The PIN is shown in the host's web console "
|
Text("The PIN is shown in the host's web console "
|
||||||
+ "(http://<host>:3000 → Pairing). "
|
+ "(https://<host>:47992 → Pairing). "
|
||||||
+ "Pairing verifies both sides at once — no fingerprint "
|
+ "Pairing verifies both sides at once — no fingerprint "
|
||||||
+ "comparison needed.")
|
+ "comparison needed.")
|
||||||
.font(.geist(12, relativeTo: .caption))
|
.font(.geist(12, relativeTo: .caption))
|
||||||
@@ -210,7 +210,7 @@ struct PairSheet: View {
|
|||||||
onPaired(fingerprint)
|
onPaired(fingerprint)
|
||||||
dismiss()
|
dismiss()
|
||||||
case .failure(PunktfunkClientError.wrongPIN):
|
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."
|
+ "and try again."
|
||||||
case .failure(PunktfunkClientError.rejected(let rejection)):
|
case .failure(PunktfunkClientError.rejected(let rejection)):
|
||||||
// The host answered and said why (not armed / rate-limited / armed for
|
// The host answered and said why (not armed / rate-limited / armed for
|
||||||
|
|||||||
Reference in New Issue
Block a user