From 90c72581eaff98825cd9b88a9cc8e7825cc8304d Mon Sep 17 00:00:00 2001 From: deymosh <232244450+deymosh@users.noreply.github.com> Date: Fri, 16 Oct 2026 17:02:04 +0200 Subject: [PATCH 01/30] feat(protocol): a paired phone signs a browser in to the bridge's web page The bridge's web page has no password: it shows a short code, and a paired phone sending that code as a signed command (`web-sign-in`) is what lets the browser in. The engine keeps the codes the page is showing (told by the runtime as each is shown), matches one once and only before it lapses, answers the phone with `web-sign-in-result`, and tells the runtime which browser to let in. A code read off a screen is worthless without a paired phone, and a typed one is read in any case with or without its dash. Co-Authored-By: Claude Code --- crates/bridge-core/src/engine/mod.rs | 5 ++ crates/bridge-core/src/engine/phone.rs | 2 + crates/bridge-core/src/engine/web.rs | 78 ++++++++++++++++++++++ crates/bridge-core/src/io.rs | 6 ++ crates/client-runtime/src/dispatch.rs | 2 + crates/protocol/fixtures/corpus.json | 7 +- crates/protocol/src/commands.rs | 13 ++++ crates/protocol/src/events.rs | 11 +++ crates/protocol/tests/codec_conformance.rs | 6 +- 9 files changed, 126 insertions(+), 4 deletions(-) create mode 100644 crates/bridge-core/src/engine/web.rs diff --git a/crates/bridge-core/src/engine/mod.rs b/crates/bridge-core/src/engine/mod.rs index 4258765f..4f87f986 100644 --- a/crates/bridge-core/src/engine/mod.rs +++ b/crates/bridge-core/src/engine/mod.rs @@ -30,6 +30,7 @@ pub use session_keys::MAX_CLIENTS; mod settings; mod terminal; pub use terminal::{TerminalAllowlist, TerminalAuditRecord, TerminalAuditWhat, TerminalConfig, PendingDevice}; +mod web; use std::collections::BTreeMap; @@ -173,6 +174,8 @@ pub struct Engine { terminals: Terminals, pairing: Option, pairing_epoch: u64, + /// The sign-in codes the web page is showing. + web_sign_ins: web::WebSignIns, nacks: NackBudget, started: bool, stopped: bool, @@ -230,6 +233,7 @@ impl Engine { sync, terminals, pairing: None, + web_sign_ins: web::WebSignIns::default(), pairing_epoch: 0, nacks: NackBudget::default(), started: false, @@ -276,6 +280,7 @@ impl Engine { Input::TerminalAllowlist(allowlist) => self.on_terminal_allowlist(allowlist), Input::Unpaired { identity } => self.unpair(&identity), Input::Shutdown => self.shutdown(), + Input::WebSignInPending { code, expires_ms } => self.on_web_sign_in_pending(code, expires_ms), } self.requester = None; self.flush(); diff --git a/crates/bridge-core/src/engine/phone.rs b/crates/bridge-core/src/engine/phone.rs index 1a750498..5373b26b 100644 --- a/crates/bridge-core/src/engine/phone.rs +++ b/crates/bridge-core/src/engine/phone.rs @@ -64,6 +64,7 @@ fn type_name(msg: &PhoneToBridge) -> &'static str { PhoneToBridge::TerminalReplay(_) => "terminal-replay", PhoneToBridge::TerminalTakeover(_) => "terminal-takeover", PhoneToBridge::TerminalClose(_) => "terminal-close", + PhoneToBridge::WebSignIn(_) => "web-sign-in", } } @@ -194,6 +195,7 @@ impl Engine { PhoneToBridge::TerminalReplay(m) => self.on_terminal_replay(m, super::terminal::via_of(via)), PhoneToBridge::TerminalTakeover(m) => self.on_terminal_takeover(m, super::terminal::via_of(via)), PhoneToBridge::TerminalClose(m) => self.on_terminal_close(m, super::terminal::via_of(via)), + PhoneToBridge::WebSignIn(m) => self.on_web_sign_in(&m.code, phone), } } diff --git a/crates/bridge-core/src/engine/web.rs b/crates/bridge-core/src/engine/web.rs new file mode 100644 index 00000000..4687f758 --- /dev/null +++ b/crates/bridge-core/src/engine/web.rs @@ -0,0 +1,78 @@ +//! Browser sign-in for the bridge's web page. +//! +//! The page shows a short code to a browser that asks to sign in, and tells +//! the engine ([`Input::WebSignInPending`]); a paired phone sends that code +//! (`web-sign-in`), and the engine — which already knows the command came +//! from a paired identity — matches it and lets that browser in +//! ([`Effect::WebSignedIn`]). A code works once, and only until it lapses: +//! anyone who reads it off the screen still needs a paired phone to use it. + +use std::collections::HashMap; + +use protocol::events::{BridgeToPhone, WebSignInResultMsg}; + +use super::Engine; +use crate::io::Effect; + +/// Codes the page is showing at once; the soonest to lapse goes first past +/// it (the page caps its own pending sign-ins below this). +const MAX_CODES: usize = 64; + +/// The codes the web page is showing, with when each lapses (ms). +#[derive(Debug, Default)] +pub(super) struct WebSignIns { + codes: HashMap, +} + +/// A code as a phone may type it: any case, the dash optional, spaces +/// around it ignored. +fn normalize(code: &str) -> String { + let compact: String = code.chars().filter(|c| c.is_ascii_alphanumeric()).map(|c| c.to_ascii_uppercase()).collect(); + if compact.len() == 8 { + format!("{}-{}", &compact[..4], &compact[4..]) + } else { + compact + } +} + +impl Engine { + /// The web page is showing `code` until `expires_ms`. + pub(super) fn on_web_sign_in_pending(&mut self, code: String, expires_ms: u64) { + let now = self.now(); + let codes = &mut self.web_sign_ins.codes; + codes.retain(|_, expires| *expires > now); + while codes.len() >= MAX_CODES { + let Some(soonest) = codes.iter().min_by_key(|(_, e)| **e).map(|(c, _)| c.clone()) else { break }; + codes.remove(&soonest); + } + codes.insert(normalize(&code), expires_ms); + } + + /// A paired phone sent `code`: sign in the browser showing it, once. + pub(super) fn on_web_sign_in(&mut self, code: &str, phone: &str) { + let code = normalize(code); + let now = self.now(); + let live = self.web_sign_ins.codes.remove(&code).is_some_and(|expires| expires > now); + if live { + let by = self.paired.iter().find(|p| p.pubkey_hex == phone).map(|p| p.npub.clone()).unwrap_or_else(|| phone.to_string()); + log::info!("[Engine] A browser was signed in to the web page"); + self.out.push(Effect::WebSignedIn { code: code.clone(), by }); + } else { + log::info!("[Engine] A web sign-in code did not match"); + } + self.publish_to(phone, BridgeToPhone::WebSignInResult(WebSignInResultMsg { code, signed_in: live })); + } +} + +#[cfg(test)] +mod tests { + use super::normalize; + + #[test] + fn a_typed_code_is_read_in_any_case_with_or_without_its_dash() { + assert_eq!(normalize("k7qm-4xpa"), "K7QM-4XPA"); + assert_eq!(normalize(" K7QM4XPA "), "K7QM-4XPA"); + assert_eq!(normalize("K7QM 4XPA"), "K7QM-4XPA"); + assert_eq!(normalize("ABC"), "ABC", "a wrong length is kept as typed, and matches nothing"); + } +} diff --git a/crates/bridge-core/src/io.rs b/crates/bridge-core/src/io.rs index 33df0041..02ab2328 100644 --- a/crates/bridge-core/src/io.rs +++ b/crates/bridge-core/src/io.rs @@ -234,6 +234,9 @@ pub enum Input { /// Stop: end every session, publish the offline heartbeat, then /// [`Effect::Stopped`]. Shutdown, + /// The web page is showing sign-in `code` to a browser until + /// `expires_ms`; a paired phone sending it signs that browser in. + WebSignInPending { code: String, expires_ms: u64 }, } #[derive(Debug)] @@ -301,6 +304,9 @@ pub enum Effect { /// Shutdown is complete: every publish before this one must still go /// out, then the runtime may close the host and the relays. Stopped, + /// A paired phone sent the web page's sign-in `code`: the browser + /// showing it is signed in, by identity `by` (its npub). + WebSignedIn { code: String, by: String }, } /// Well-known [`Store`](crate::ports::Store) keys. diff --git a/crates/client-runtime/src/dispatch.rs b/crates/client-runtime/src/dispatch.rs index d5fcdd56..235857c5 100644 --- a/crates/client-runtime/src/dispatch.rs +++ b/crates/client-runtime/src/dispatch.rs @@ -516,6 +516,8 @@ impl<'a> Router<'a> { r.persist(StoreId::Machines); } } + // Shown by the screen that sent the code, which waits for it. + BridgeToPhone::WebSignInResult(_) => {} BridgeToPhone::ProviderProfileAck(m) => { self.stores.ui.apply_provider_profile_ack( machine, diff --git a/crates/protocol/fixtures/corpus.json b/crates/protocol/fixtures/corpus.json index 4d00c697..146152c3 100644 --- a/crates/protocol/fixtures/corpus.json +++ b/crates/protocol/fixtures/corpus.json @@ -81,9 +81,11 @@ { "v": 12, "type": "terminal-resize", "term": "t1", "cols": 100, "rows": 30 }, { "v": 12, "type": "terminal-replay", "term": "t1", "from": 4096 }, { "v": 12, "type": "terminal-takeover", "term": "t1" }, - { "v": 12, "type": "terminal-close", "term": "t1" } + { "v": 12, "type": "terminal-close", "term": "t1" }, + { "v": 12, "type": "web-sign-in", "code": "K7QM-4XPA" } ], "rejected": [ + { "v": 12, "type": "web-sign-in" }, { "v": 13, "type": "input", "sessionId": "s", "text": "from a newer phone" }, { "type": "input", "sessionId": "s", "text": "from an unversioned sender" }, { "v": 12, "type": "input", "text": "no session id" }, @@ -216,7 +218,8 @@ { "v": 12, "type": "terminal-exited", "openId": "o2", "reason": "not-allowed", "device": "bf1f111943b3930a4c64a5c06d9153b2" }, { "v": 12, "type": "terminal-event", "term": "t1", "what": "takeover", "device": "bf1f111943b3930a4c64a5c06d9153b2", "name": "Pixel 8", "via": "relay", "at": 1792008058637 }, { "v": 12, "type": "terminal-event", "term": "t1", "what": "closed", "device": "aa11", "via": "direct", "at": 1792008058638 }, - { "v": 12, "type": "sessions", "machine": "m", "sessions": [], "agents": [], "terminals": [{ "term": "t1", "shell": "/bin/bash", "opened": 1792008058637, "device": "bf1f111943b3930a4c64a5c06d9153b2", "name": "Pixel 8", "writer": "bf1f111943b3930a4c64a5c06d9153b2", "cols": 80, "rows": 24 }, { "term": "t2", "shell": "/bin/zsh", "opened": 1792008058638, "device": "aa11", "writer": "aa11", "cols": 132, "rows": 43 }] } + { "v": 12, "type": "sessions", "machine": "m", "sessions": [], "agents": [], "terminals": [{ "term": "t1", "shell": "/bin/bash", "opened": 1792008058637, "device": "bf1f111943b3930a4c64a5c06d9153b2", "name": "Pixel 8", "writer": "bf1f111943b3930a4c64a5c06d9153b2", "cols": 80, "rows": 24 }, { "term": "t2", "shell": "/bin/zsh", "opened": 1792008058638, "device": "aa11", "writer": "aa11", "cols": 132, "rows": 43 }] }, + { "v": 12, "type": "web-sign-in-result", "code": "K7QM-4XPA", "signedIn": true } ], "rejected": [ { "v": 10, "type": "input-ack", "sessionId": "s", "inputId": "i" }, diff --git a/crates/protocol/src/commands.rs b/crates/protocol/src/commands.rs index e459a38b..69373cad 100644 --- a/crates/protocol/src/commands.rs +++ b/crates/protocol/src/commands.rs @@ -564,6 +564,17 @@ pub struct TerminalIdMsg { pub term: String, } +/// `web-sign-in`: sign in the browser showing `code` on this bridge's web +/// page. The page shows a short code (and a QR of it) to a browser that asks +/// to sign in; a paired phone sending it — signed by the identity, like every +/// command — is what lets that browser in, so the page needs no password. +/// Reply: `web-sign-in-result`. +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, specta::Type)] +#[serde(rename_all = "camelCase")] +pub struct WebSignInMsg { + pub code: String, +} + /// The phone→bridge message union. #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, specta::Type)] #[serde(tag = "type", rename_all = "kebab-case")] @@ -624,6 +635,7 @@ pub enum PhoneToBridge { TerminalTakeover(TerminalIdMsg), /// Hang up a terminal. TerminalClose(TerminalIdMsg), + WebSignIn(WebSignInMsg), } #[cfg(test)] @@ -696,6 +708,7 @@ mod tests { rt(&json!({"v":12,"type":"pair-request","npub":"npub1","pubkeyHex":"aa","label":"phone","token":"t"})); rt(&json!({"v":12,"type":"pair-request","npub":"npub1","pubkeyHex":"aa","label":"phone","token":"t","sessionKey":{"pubkeyHex":"bb","bridgePubkeyHex":"cc","expiresAt":1800000000}})); rt(&json!({"v":12,"type":"provider-profiles-request"})); + rt(&json!({"v":12,"type":"web-sign-in","code":"K7QM-4XPA"})); rt(&json!({"v":12,"type":"session-key","sessionKey":{"pubkeyHex":"bb","bridgePubkeyHex":"cc","expiresAt":1800000000}})); rt(&json!({"v":12,"type":"session-key","sessionKey":{"pubkeyHex":"bb","bridgePubkeyHex":"cc","expiresAt":1800000000,"label":"Pixel 8"}})); rt(&json!({"v":12,"type":"presence","watchingTerminal":"t1"})); diff --git a/crates/protocol/src/events.rs b/crates/protocol/src/events.rs index 58c22df8..83e1636c 100644 --- a/crates/protocol/src/events.rs +++ b/crates/protocol/src/events.rs @@ -617,6 +617,16 @@ pub struct TerminalEventMsg { pub at: u64, } +/// The answer to `web-sign-in`, to the client that sent it: whether `code` +/// was one the web page is showing now (and so a browser is signed in), or +/// not — mistyped, expired, or already used. +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, specta::Type)] +#[serde(rename_all = "camelCase")] +pub struct WebSignInResultMsg { + pub code: String, + pub signed_in: bool, +} + /// The bridge→phone message union. #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, specta::Type)] #[serde(tag = "type", rename_all = "kebab-case")] @@ -660,6 +670,7 @@ pub enum BridgeToPhone { TerminalExited(TerminalExitedMsg), /// To every present client of the identity. TerminalEvent(TerminalEventMsg), + WebSignInResult(WebSignInResultMsg), } #[cfg(test)] diff --git a/crates/protocol/tests/codec_conformance.rs b/crates/protocol/tests/codec_conformance.rs index e03df823..3ab0aff2 100644 --- a/crates/protocol/tests/codec_conformance.rs +++ b/crates/protocol/tests/codec_conformance.rs @@ -109,9 +109,10 @@ fn p2b_type(m: &PhoneToBridge) -> &'static str { PhoneToBridge::TerminalReplay(_) => "terminal-replay", PhoneToBridge::TerminalTakeover(_) => "terminal-takeover", PhoneToBridge::TerminalClose(_) => "terminal-close", + PhoneToBridge::WebSignIn(_) => "web-sign-in", } } -const P2B_TYPES: usize = 42; +const P2B_TYPES: usize = 43; /// Every bridge→phone message type, by wire name (see [`p2b_type`]). fn b2p_type(m: &BridgeToPhone) -> &'static str { @@ -153,9 +154,10 @@ fn b2p_type(m: &BridgeToPhone) -> &'static str { BridgeToPhone::TerminalInputFrom(_) => "terminal-input-from", BridgeToPhone::TerminalExited(_) => "terminal-exited", BridgeToPhone::TerminalEvent(_) => "terminal-event", + BridgeToPhone::WebSignInResult(_) => "web-sign-in-result", } } -const B2P_TYPES: usize = 37; +const B2P_TYPES: usize = 38; #[test] fn corpus_covers_every_message_type() { From 725e63935216756ddb73b846ec065c0cbceb0288 Mon Sep 17 00:00:00 2001 From: deymosh <232244450+deymosh@users.noreply.github.com> Date: Fri, 16 Oct 2026 17:02:04 +0200 Subject: [PATCH 02/30] feat(bridge): a web page on the direct link's port, signed in with the phone MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The direct link's `wss://` listener now also serves a web page: a request that is not a WebSocket upgrade is a page request, the bytes read to tell them apart are replayed to the WebSocket handshake, and the onion listener serves no page. Same port and certificate, so a bridge that has a direct link has the page with no new setting, over TLS on the LAN or a VPN. A browser signs in with the owner's phone: the page shows a code and its QR, and once a paired phone sends it the browser gets a cookie that only the server reads, only HTTPS carries, and no other site sends (`__Host-`, `Secure`, `HttpOnly`, `SameSite=Strict`), for 30 days. Requests must name an IP address, localhost or a direct endpoint's host; a POST must come from the page's own origin; every response forbids framing, sniffing, referrers, caching and any resource not from the page; sign-in starts are rate-limited per address and pending codes and sessions are capped. The first page shows the bridge, its direct link, its agents with their credential status and its sessions — the heartbeat, which never carries a secret. Co-Authored-By: Claude Code --- Cargo.lock | 1 + crates/bridge-runtime/Cargo.toml | 4 + crates/bridge-runtime/src/direct.rs | 90 ++++- crates/bridge-runtime/src/lib.rs | 1 + crates/bridge-runtime/src/qr.rs | 28 ++ crates/bridge-runtime/src/runtime.rs | 12 +- crates/bridge-runtime/src/web.rs | 533 +++++++++++++++++++++++++++ crates/bridge-runtime/web/app.css | 94 +++++ crates/bridge-runtime/web/app.js | 180 +++++++++ crates/bridge-runtime/web/index.html | 70 ++++ 10 files changed, 1006 insertions(+), 7 deletions(-) create mode 100644 crates/bridge-runtime/src/web.rs create mode 100644 crates/bridge-runtime/web/app.css create mode 100644 crates/bridge-runtime/web/app.js create mode 100644 crates/bridge-runtime/web/index.html diff --git a/Cargo.lock b/Cargo.lock index 04b226c4..1d7202fd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -389,6 +389,7 @@ dependencies = [ "env_logger", "futures-util", "hex", + "httparse", "log", "nix", "nostr", diff --git a/crates/bridge-runtime/Cargo.toml b/crates/bridge-runtime/Cargo.toml index 1dc298b6..9f77053f 100644 --- a/crates/bridge-runtime/Cargo.toml +++ b/crates/bridge-runtime/Cargo.toml @@ -48,6 +48,10 @@ tokio-rustls = { version = "0.26", default-features = false, features = ["ring", rustls = { version = "0.23", default-features = false, features = ["ring", "std", "tls12"] } rcgen = { version = "0.13", default-features = false, features = ["crypto", "ring"] } futures-util = { version = "0.3", default-features = false, features = ["sink", "std"] } +# The web page's request parsing (`src/web.rs`), already in the tree through +# the WebSocket handshake. +httparse = "1" + # Terminals (src/terminal.rs): a real pty per terminal the phone opens — a # unix pty, ConPTY on Windows — so interactive programs behave as they do # over ssh. The runtime owns it; the engine only decides. diff --git a/crates/bridge-runtime/src/direct.rs b/crates/bridge-runtime/src/direct.rs index 2f61e96f..9ca035b9 100644 --- a/crates/bridge-runtime/src/direct.rs +++ b/crates/bridge-runtime/src/direct.rs @@ -7,6 +7,10 @@ //! - `ws://` on [`DirectConfig::onion_listen`], loopback only, for an onion //! service to forward to. //! +//! The `wss://` listener also serves the bridge's web page (`crate::web`): a +//! request that is not a WebSocket upgrade is a page request. The onion +//! listener serves no page. +//! //! A connection must finish its TLS and WebSocket handshakes within //! `HANDSHAKE_TIMEOUT`, then answer the challenge with a paired identity's //! HELLO within `HELLO_TIMEOUT`. Then it gets every event the bridge publishes @@ -31,7 +35,7 @@ use protocol::direct::{ use protocol::kinds::{COMMAND_KIND, LIVE_KIND}; use protocol::nostr_event::SignedEvent; use sha2::{Digest, Sha256}; -use tokio::io::{AsyncRead, AsyncWrite}; +use tokio::io::{AsyncRead, AsyncReadExt, AsyncWrite, ReadBuf}; use tokio::net::TcpListener; use tokio::sync::mpsc; use tokio::task::JoinHandle; @@ -72,6 +76,8 @@ fn short(key: &str) -> &str { /// What the runtime needs of a running direct link. pub struct Direct { pub hub: Rc, + /// The web page served on the `wss://` listener. + pub web: Rc, /// What the heartbeat advertises. pub info: DirectInfo, tasks: Vec>, @@ -273,6 +279,8 @@ pub async fn start( log::info!("[Direct] Off (no direct listener configured)"); return Ok(None); } + let npub = protocol::crypto::npub_from_hex(&bridge_pubkey).unwrap_or_else(|_| bridge_pubkey.clone()); + let web = crate::web::Web::new(npub, &config.endpoints, inputs.clone()); let hub = Hub::new(bridge_pubkey, inputs); let mut tasks = Vec::new(); let mut bound_wss = None; @@ -286,9 +294,11 @@ pub async fn start( let bound = listener.local_addr().map_err(|e| e.to_string())?; bound_wss = Some(bound); log::info!("[Direct] Listening on wss://{bound} (certificate sha256 {})", cert.sha256_hex()); + log::info!("[Web] The bridge's web page is at https://{}/ (same certificate)", advertised(bound)); let hub = Rc::clone(&hub); + let web = Rc::clone(&web); tasks.push(tokio::task::spawn_local(async move { - accept_loop(listener, hub, move |stream| { + accept_loop(listener, hub, Some(web), move |stream| { let acceptor = acceptor.clone(); async move { acceptor.accept(stream).await.ok() } }) @@ -300,7 +310,7 @@ pub async fn start( log::info!("[Direct] Listening on ws://{addr} for an onion service"); let hub = Rc::clone(&hub); tasks.push(tokio::task::spawn_local(async move { - accept_loop(listener, hub, |stream| async move { Some(stream) }).await + accept_loop(listener, hub, None, |stream| async move { Some(stream) }).await })); } let endpoints = advertised_endpoints(config, bound_wss, in_container()); @@ -313,7 +323,7 @@ pub async fn start( Add the host's address to direct.endpoints, or on the phone (the machine's page)." ); } - Ok(Some(Direct { hub, info: DirectInfo { endpoints, cert_sha256 }, tasks })) + Ok(Some(Direct { hub, web, info: DirectInfo { endpoints, cert_sha256 }, tasks })) } /// The endpoints the heartbeat advertises: the configured ones, led by the @@ -372,7 +382,7 @@ fn lan_ip() -> Option { socket.local_addr().ok().map(|a| a.ip()).filter(|ip| !ip.is_unspecified() && !ip.is_loopback()) } -async fn accept_loop(listener: TcpListener, hub: Rc, secure: F) +async fn accept_loop(listener: TcpListener, hub: Rc, web: Option>, secure: F) where S: AsyncRead + AsyncWrite + Unpin + 'static, F: Fn(tokio::net::TcpStream) -> Fut + 'static, @@ -393,16 +403,84 @@ where } hub.open.set(hub.open.get() + 1); let hub = Rc::clone(&hub); + let web = web.clone(); let secured = secure(stream); tokio::task::spawn_local(async move { if let Ok(Some(stream)) = tokio::time::timeout(HANDSHAKE_TIMEOUT, secured).await { - serve(stream, &hub).await; + match web { + Some(web) => route(stream, peer.ip(), &hub, &web).await, + None => serve(stream, &hub).await, + } } hub.open.set(hub.open.get() - 1); }); } } +/// A connection on the listener that also serves the web page: read the +/// request head, then hand a WebSocket upgrade to the direct link (with the +/// bytes already read put back in front) and anything else to the page. +async fn route(mut stream: S, peer: IpAddr, hub: &Hub, web: &crate::web::Web) { + let Ok(Some(head)) = tokio::time::timeout(HANDSHAKE_TIMEOUT, read_head(&mut stream)).await else { return }; + if crate::web::is_websocket(&head) { + serve(Replay { prefix: head, at: 0, inner: stream }, hub).await; + } else { + crate::web::serve(&head, stream, peer, web).await; + } +} + +/// Read until the request head is complete (with whatever followed it in the +/// same reads), or `None` past [`crate::web::MAX_HEAD_BYTES`] or at the end. +async fn read_head(stream: &mut S) -> Option> { + let mut buf = Vec::with_capacity(1024); + let mut chunk = [0u8; 2048]; + while crate::web::head_len(&buf).is_none() { + if buf.len() >= crate::web::MAX_HEAD_BYTES { + return None; + } + let read = stream.read(&mut chunk).await.ok()?; + if read == 0 { + return None; + } + buf.extend_from_slice(&chunk[..read]); + } + Some(buf) +} + +/// A stream that yields `prefix` before reading on from `inner`: the request +/// head [`route`] read to tell a WebSocket from a page, given back to the +/// WebSocket handshake that needs it. +struct Replay { + prefix: Vec, + at: usize, + inner: S, +} + +impl AsyncRead for Replay { + fn poll_read(mut self: std::pin::Pin<&mut Self>, cx: &mut std::task::Context<'_>, buf: &mut ReadBuf<'_>) -> std::task::Poll> { + if self.at < self.prefix.len() { + let n = (self.prefix.len() - self.at).min(buf.remaining()); + let at = self.at; + buf.put_slice(&self.prefix[at..at + n]); + self.at += n; + return std::task::Poll::Ready(Ok(())); + } + std::pin::Pin::new(&mut self.inner).poll_read(cx, buf) + } +} + +impl AsyncWrite for Replay { + fn poll_write(mut self: std::pin::Pin<&mut Self>, cx: &mut std::task::Context<'_>, buf: &[u8]) -> std::task::Poll> { + std::pin::Pin::new(&mut self.inner).poll_write(cx, buf) + } + fn poll_flush(mut self: std::pin::Pin<&mut Self>, cx: &mut std::task::Context<'_>) -> std::task::Poll> { + std::pin::Pin::new(&mut self.inner).poll_flush(cx) + } + fn poll_shutdown(mut self: std::pin::Pin<&mut Self>, cx: &mut std::task::Context<'_>) -> std::task::Poll> { + std::pin::Pin::new(&mut self.inner).poll_shutdown(cx) + } +} + /// One connection: the handshake, then events both ways. async fn serve(stream: S, hub: &Hub) { let config = WebSocketConfig { max_message_size: Some(MAX_FRAME_BYTES), max_frame_size: Some(MAX_FRAME_BYTES), ..Default::default() }; diff --git a/crates/bridge-runtime/src/lib.rs b/crates/bridge-runtime/src/lib.rs index dc273ac4..7f158b2c 100644 --- a/crates/bridge-runtime/src/lib.rs +++ b/crates/bridge-runtime/src/lib.rs @@ -11,6 +11,7 @@ pub mod config; pub mod direct; pub mod host; pub mod uploads; +pub mod web; pub mod qr; pub mod relay; pub mod runtime; diff --git a/crates/bridge-runtime/src/qr.rs b/crates/bridge-runtime/src/qr.rs index 2234a816..9b1e91fa 100644 --- a/crates/bridge-runtime/src/qr.rs +++ b/crates/bridge-runtime/src/qr.rs @@ -34,8 +34,36 @@ pub fn render(data: &str) -> String { out } +/// The same code as an SVG for the web page: one path of unit squares on a +/// white field with a four-module quiet zone, which phone cameras need to +/// find the code. `None` when `data` does not fit in a QR code. +pub fn svg(data: &str) -> Option { + const SVG_QUIET: usize = 4; + let code = QrCode::with_error_correction_level(data, EcLevel::M).ok()?; + let width = code.width(); + let size = width + 2 * SVG_QUIET; + let mut path = String::new(); + for (i, color) in code.to_colors().iter().enumerate() { + if *color == Color::Dark { + let (x, y) = (i % width + SVG_QUIET, i / width + SVG_QUIET); + path.push_str(&format!("M{x} {y}h1v1h-1z")); + } + } + Some(format!( + "\ + " + )) +} + #[cfg(test)] mod tests { + #[test] + fn draws_an_svg_with_its_quiet_zone() { + let svg = super::svg("codedeck://web-sign-in?code=ABCD").unwrap(); + assert!(svg.starts_with("")); + assert!(svg.contains("fill=\"#fff\"") && svg.contains("M4 4h1v1h-1z"), "the finder pattern starts past the quiet zone"); + } + #[test] fn renders_a_square_block_with_a_light_border() { let qr = super::render("codedeck://pair?npub=npub1xyz&token=abc"); diff --git a/crates/bridge-runtime/src/runtime.rs b/crates/bridge-runtime/src/runtime.rs index ada72916..e90c3c36 100644 --- a/crates/bridge-runtime/src/runtime.rs +++ b/crates/bridge-runtime/src/runtime.rs @@ -345,7 +345,17 @@ impl Runtime { /// shell is started. async fn execute(&mut self, effect: Effect) -> bool { match effect { - Effect::Publish { to, message } => self.relays.publish(to, message), + Effect::Publish { to, message } => { + if let (protocol::events::BridgeToPhone::Sessions(list), Some(direct)) = (&message, &self.direct) { + direct.web.set_heartbeat(list); + } + self.relays.publish(to, message) + } + Effect::WebSignedIn { code, by } => { + if let Some(direct) = &self.direct { + direct.web.signed_in(&code, &by); + } + } Effect::Host(frame) => self.host.send(&frame), Effect::SetTimer { id, after_ms } => { let inputs = self.inputs.clone(); diff --git a/crates/bridge-runtime/src/web.rs b/crates/bridge-runtime/src/web.rs new file mode 100644 index 00000000..5420144c --- /dev/null +++ b/crates/bridge-runtime/src/web.rs @@ -0,0 +1,533 @@ +//! The bridge's web page: what the bridge is doing, for a browser on the +//! machine, the LAN or a VPN. +//! +//! It is served on the direct link's `wss://` listener — the same port and +//! the same self-signed certificate (whose SHA-256 the heartbeat already +//! carries, so a paired phone can show what the browser should see). A +//! request that asks for a WebSocket goes on to the direct link as before; +//! any other is a page request, handled here. Nothing is served in +//! cleartext: the onion listener (plain `ws://` on loopback, for Tor) serves +//! no page. +//! +//! A browser signs in with the owner's phone, never with a password: the page +//! shows a short code (and a QR of it), and a paired phone sends that code as +//! a signed command, which the engine matches (`engine::web`). Until then the +//! browser sees only the sign-in page. The session lives in a cookie the +//! server alone can read, and only HTTPS carries it (`__Host-`, `Secure`, +//! `HttpOnly`, `SameSite=Strict`); it lapses after [`SESSION_TTL_MS`]. +//! +//! Hardening, since a LAN or VPN is not a trusted place: +//! - the `Host` must be an IP address, `localhost`, or a host the direct +//! link's endpoints name — a DNS name an attacker points at this machine +//! is refused (and its certificate would not match anyway); +//! - every `POST` must carry an `Origin` equal to the page's own; +//! - every response forbids framing, sniffing, referrers, caching and any +//! script, style or connection not from the page itself (CSP); +//! - sign-in starts are rate-limited per address, pending codes and +//! sessions are capped, and requests are bounded in size and time. +//! +//! The page never shows a secret: what it reads is the heartbeat, which by +//! protocol carries credential status and never a credential. + +use std::cell::RefCell; +use std::collections::HashMap; +use std::net::IpAddr; +use std::rc::Rc; +use std::time::Duration; + +use base64::Engine as _; +use bridge_core::Input; +use protocol::events::SessionListMsg; +use sha2::{Digest, Sha256}; +use tokio::io::{AsyncRead, AsyncReadExt, AsyncWrite, AsyncWriteExt}; +use tokio::sync::mpsc; + +/// Largest request head accepted (request line and headers). +pub const MAX_HEAD_BYTES: usize = 16 * 1024; +/// Largest request body accepted; the page only ever posts a few fields. +const MAX_BODY_BYTES: usize = 16 * 1024; +/// How long a request has to arrive whole once its head has. +const BODY_TIMEOUT: Duration = Duration::from_secs(10); +/// How long a sign-in code shown on the page can be approved. +pub const PENDING_TTL_MS: u64 = 5 * 60 * 1000; +/// How long a signed-in browser stays signed in. +const SESSION_TTL_MS: u64 = 30 * 24 * 3600 * 1000; +/// Pending sign-ins kept at once; the oldest goes first past it. +const MAX_PENDING: usize = 32; +/// Signed-in browsers kept at once; the oldest goes first past it. +const MAX_SESSIONS: usize = 64; +/// Sign-in starts allowed per address per minute. +const STARTS_PER_MINUTE: u32 = 10; +/// The session cookie. `__Host-` makes the browser keep it only when it was +/// set over HTTPS, for the whole site, by this exact host. +const COOKIE: &str = "__Host-codedeck"; +/// The characters a sign-in code is drawn from: no 0/O, 1/I/L, so it can be +/// read off a screen and typed on a phone without doubt. +const CODE_ALPHABET: &[u8] = b"23456789ABCDEFGHJKMNPQRSTUVWXYZ"; + +const INDEX_HTML: &str = include_str!("../web/index.html"); +const APP_JS: &str = include_str!("../web/app.js"); +const APP_CSS: &str = include_str!("../web/app.css"); + +fn now_ms() -> u64 { + std::time::SystemTime::now().duration_since(std::time::UNIX_EPOCH).map(|d| d.as_millis() as u64).unwrap_or(0) +} + +/// Where one browser stands. +#[derive(Debug, Clone, PartialEq, Eq)] +enum Access { + /// Showing `code`, waiting for a phone to send it. + Pending { code: String, expires_ms: u64 }, + /// Signed in by `by` (the identity that approved it). + SignedIn { by: String, since_ms: u64, expires_ms: u64 }, +} + +#[derive(Debug, Clone)] +struct Browser { + access: Access, + peer: IpAddr, + created_ms: u64, +} + +/// The page's state: the latest heartbeat and the browsers it knows. +pub struct Web { + machine_npub: String, + /// Host names (lowercase, no port) a request may name besides an IP + /// address and `localhost`. + hosts: Vec, + heartbeat: RefCell>, + /// By the SHA-256 of the cookie's value, so the table holds no token a + /// memory dump could replay. + browsers: RefCell>, + starts: RefCell>, + inputs: mpsc::UnboundedSender, +} + +impl Web { + pub fn new(machine_npub: String, endpoints: &[String], inputs: mpsc::UnboundedSender) -> Rc { + let hosts = endpoints.iter().filter_map(|url| endpoint_host(url)).collect(); + Rc::new(Self { + machine_npub, + hosts, + heartbeat: RefCell::default(), + browsers: RefCell::default(), + starts: RefCell::default(), + inputs, + }) + } + + /// The heartbeat the bridge just published, which the status page shows. + pub fn set_heartbeat(&self, list: &SessionListMsg) { + *self.heartbeat.borrow_mut() = Some(list.clone()); + } + + /// A phone of `by` sent `code`, and the engine matched it to a code this + /// page showed: that browser is signed in. + pub fn signed_in(&self, code: &str, by: &str) { + let now = now_ms(); + for browser in self.browsers.borrow_mut().values_mut() { + if matches!(&browser.access, Access::Pending { code: c, .. } if c == code) { + log::info!("[Web] A browser at {} signed in", browser.peer); + browser.access = Access::SignedIn { by: by.to_string(), since_ms: now, expires_ms: now + SESSION_TTL_MS }; + } + } + } + + fn browser(&self, token: Option<&str>) -> Option<(String, Browser)> { + let key = token_key(token?); + let now = now_ms(); + let mut browsers = self.browsers.borrow_mut(); + let expired = match browsers.get(&key)?.access { + Access::Pending { expires_ms, .. } | Access::SignedIn { expires_ms, .. } => expires_ms <= now, + }; + if expired { + browsers.remove(&key); + return None; + } + browsers.get(&key).map(|b| (key, b.clone())) + } + + /// Start a sign-in for a browser at `peer`: a new code, and the cookie + /// that names it. `None` when the address started too many lately. + fn start_sign_in(&self, peer: IpAddr) -> Option<(String, String)> { + let now = now_ms(); + { + let mut starts = self.starts.borrow_mut(); + starts.retain(|_, (window, _)| now - *window < 60_000); + let entry = starts.entry(peer).or_insert((now, 0)); + if entry.1 >= STARTS_PER_MINUTE { + return None; + } + entry.1 += 1; + } + let token = base64::engine::general_purpose::URL_SAFE_NO_PAD.encode(rand::random::<[u8; 32]>()); + let code = new_code(); + let expires_ms = now + PENDING_TTL_MS; + let mut browsers = self.browsers.borrow_mut(); + browsers.retain(|_, b| match b.access { + Access::Pending { expires_ms, .. } | Access::SignedIn { expires_ms, .. } => expires_ms > now, + }); + evict_oldest(&mut browsers, MAX_PENDING, |b| matches!(b.access, Access::Pending { .. })); + browsers.insert(token_key(&token), Browser { access: Access::Pending { code: code.clone(), expires_ms }, peer, created_ms: now }); + evict_oldest(&mut browsers, MAX_SESSIONS + MAX_PENDING, |_| true); + let _ = self.inputs.send(Input::WebSignInPending { code: code.clone(), expires_ms }); + Some((token, code)) + } + + fn sign_out(&self, key: &str) { + self.browsers.borrow_mut().remove(key); + } + + fn status_json(&self, by: &str, since_ms: u64) -> String { + let heartbeat = self.heartbeat.borrow(); + serde_json::json!({ + "machine": self.machine_npub, + "signedInBy": by, + "signedInSince": since_ms, + "heartbeat": heartbeat.as_ref().map(|h| serde_json::to_value(h).unwrap_or(serde_json::Value::Null)), + }) + .to_string() + } +} + +/// Drop the oldest browsers matching `which` until at most `cap` of them are +/// left. +fn evict_oldest(browsers: &mut HashMap, cap: usize, which: impl Fn(&Browser) -> bool) { + loop { + let matching: Vec<(&String, &Browser)> = browsers.iter().filter(|(_, b)| which(b)).collect(); + if matching.len() < cap.max(1) { + return; + } + let Some(oldest) = matching.iter().min_by_key(|(_, b)| b.created_ms).map(|(k, _)| (*k).clone()) else { return }; + browsers.remove(&oldest); + } +} + +fn token_key(token: &str) -> String { + hex::encode(Sha256::digest(token.as_bytes())) +} + +/// Eight characters in two groups (`K7QM-4XPA`): about 39 bits, guessed only +/// by sending a signed command from a paired phone within its five minutes. +fn new_code() -> String { + let bytes = rand::random::<[u8; 8]>(); + let chars: String = bytes.iter().map(|b| CODE_ALPHABET[*b as usize % CODE_ALPHABET.len()] as char).collect(); + format!("{}-{}", &chars[..4], &chars[4..]) +} + +/// The host part of a direct endpoint URL, lowercase. +fn endpoint_host(url: &str) -> Option { + let rest = url.split_once("://")?.1; + let authority = rest.split('/').next()?; + let host = if let Some(v6) = authority.strip_prefix('[') { v6.split(']').next()? } else { authority.split(':').next()? }; + (!host.is_empty()).then(|| host.to_ascii_lowercase()) +} + +/// Where the head of the request in `buf` ends, once it has. +pub fn head_len(buf: &[u8]) -> Option { + buf.windows(4).position(|w| w == b"\r\n\r\n").map(|i| i + 4) +} + +/// Whether the request head in `buf` asks for a WebSocket. +pub fn is_websocket(buf: &[u8]) -> bool { + let mut headers = [httparse::EMPTY_HEADER; 64]; + let mut request = httparse::Request::new(&mut headers); + if request.parse(buf).is_err() { + return false; + } + request.headers.iter().any(|h| { + h.name.eq_ignore_ascii_case("upgrade") && std::str::from_utf8(h.value).is_ok_and(|v| v.trim().eq_ignore_ascii_case("websocket")) + }) +} + +/// One parsed request. +struct Request { + method: String, + path: String, + host: Option, + origin: Option, + cookie: Option, +} + +/// Parse the request whose head is in `buf` (with whatever of its body came +/// with it), reading the rest of the body from `stream`. +async fn read_request(buf: &[u8], stream: &mut S) -> Result { + let mut headers = [httparse::EMPTY_HEADER; 64]; + let mut parsed = httparse::Request::new(&mut headers); + let head = match parsed.parse(buf) { + Ok(httparse::Status::Complete(n)) => n, + _ => return Err(400), + }; + let header = |name: &str| { + parsed.headers.iter().find(|h| h.name.eq_ignore_ascii_case(name)).and_then(|h| std::str::from_utf8(h.value).ok()).map(str::to_string) + }; + let length: usize = match header("content-length") { + Some(v) => v.trim().parse().map_err(|_| 400u16)?, + None => 0, + }; + if length > MAX_BODY_BYTES || header("transfer-encoding").is_some() { + return Err(413); + } + // No route reads a body yet (a POST says what it does by its path), but + // one that came is read off whole, bounded, so the request ends cleanly. + let arrived = buf.len() - head; + if arrived < length { + let mut rest = vec![0u8; length - arrived]; + tokio::time::timeout(BODY_TIMEOUT, stream.read_exact(&mut rest)).await.map_err(|_| 408u16)?.map_err(|_| 400u16)?; + } + let cookie = header("cookie").and_then(|all| { + all.split(';').find_map(|pair| pair.trim().strip_prefix(&format!("{COOKIE}=")).map(str::to_string)) + }); + Ok(Request { + method: parsed.method.unwrap_or("").to_string(), + path: parsed.path.unwrap_or("").split('?').next().unwrap_or("").to_string(), + host: header("host"), + origin: header("origin"), + cookie, + }) +} + +/// Whether `host` (a `Host` header: name and optional port) may be served. +fn host_allowed(host: &str, hosts: &[String]) -> bool { + let name = if let Some(v6) = host.strip_prefix('[') { + v6.split(']').next().unwrap_or("") + } else { + host.rsplit_once(':').map_or(host, |(name, port)| if port.chars().all(|c| c.is_ascii_digit()) { name } else { host }) + }; + let name = name.to_ascii_lowercase(); + !name.is_empty() && (name.parse::().is_ok() || name == "localhost" || hosts.contains(&name)) +} + +/// A response, written whole and the connection closed. +struct Response { + status: u16, + content_type: &'static str, + body: Vec, + set_cookie: Option, +} + +impl Response { + fn new(status: u16, content_type: &'static str, body: impl Into>) -> Self { + Self { status, content_type, body: body.into(), set_cookie: None } + } + + fn json(status: u16, body: String) -> Self { + Self::new(status, "application/json", body) + } + + fn error(status: u16) -> Self { + Self::json(status, serde_json::json!({ "error": reason(status) }).to_string()) + } +} + +fn reason(status: u16) -> &'static str { + match status { + 200 => "OK", + 400 => "Bad Request", + 401 => "Unauthorized", + 403 => "Forbidden", + 404 => "Not Found", + 405 => "Method Not Allowed", + 408 => "Request Timeout", + 413 => "Payload Too Large", + 429 => "Too Many Requests", + _ => "Error", + } +} + +async fn write_response(stream: &mut S, response: Response) { + let mut head = format!( + "HTTP/1.1 {} {}\r\nContent-Type: {}\r\nContent-Length: {}\r\nConnection: close\r\n\ + Cache-Control: no-store\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: DENY\r\n\ + Referrer-Policy: no-referrer\r\nCross-Origin-Opener-Policy: same-origin\r\n\ + Content-Security-Policy: default-src 'none'; script-src 'self'; style-src 'self'; img-src 'self'; \ + connect-src 'self'; frame-ancestors 'none'; base-uri 'none'; form-action 'none'\r\n", + response.status, + reason(response.status), + response.content_type, + response.body.len(), + ); + if let Some(cookie) = response.set_cookie { + head.push_str(&format!("Set-Cookie: {cookie}\r\n")); + } + head.push_str("\r\n"); + let _ = stream.write_all(head.as_bytes()).await; + let _ = stream.write_all(&response.body).await; + let _ = stream.shutdown().await; +} + +fn session_cookie(token: &str, max_age_secs: u64) -> String { + format!("{COOKIE}={token}; Path=/; Max-Age={max_age_secs}; Secure; HttpOnly; SameSite=Strict") +} + +/// Serve one page request whose head is in `buf`, from a browser at `peer`. +pub async fn serve(buf: &[u8], mut stream: S, peer: IpAddr, web: &Web) { + let response = match read_request(buf, &mut stream).await { + Ok(request) => route(&request, peer, web), + Err(status) => Response::error(status), + }; + write_response(&mut stream, response).await; +} + +fn route(request: &Request, peer: IpAddr, web: &Web) -> Response { + let Some(host) = request.host.as_deref().filter(|h| host_allowed(h, &web.hosts)) else { + return Response::error(403); + }; + if request.method == "POST" && request.origin.as_deref() != Some(&format!("https://{host}")) { + return Response::error(403); + } + let browser = web.browser(request.cookie.as_deref()); + match (request.method.as_str(), request.path.as_str()) { + ("GET", "/") => Response::new(200, "text/html; charset=utf-8", INDEX_HTML), + ("GET", "/app.js") => Response::new(200, "text/javascript; charset=utf-8", APP_JS), + ("GET", "/app.css") => Response::new(200, "text/css; charset=utf-8", APP_CSS), + ("GET", "/api/me") => Response::json(200, me_json(browser.as_ref().map(|(_, b)| b))), + ("POST", "/api/sign-in") => match web.start_sign_in(peer) { + Some((token, code)) => { + let mut response = Response::json(200, serde_json::json!({ "state": "pending", "code": code, "expiresInMs": PENDING_TTL_MS }).to_string()); + response.set_cookie = Some(session_cookie(&token, SESSION_TTL_MS / 1000)); + response + } + None => Response::error(429), + }, + ("GET", "/api/sign-in/qr.svg") => match browser { + Some((_, Browser { access: Access::Pending { code, .. }, .. })) => { + let url = format!("codedeck://web-sign-in?machine={}&code={code}", web.machine_npub); + match crate::qr::svg(&url) { + Some(svg) => Response::new(200, "image/svg+xml", svg), + None => Response::error(404), + } + } + _ => Response::error(404), + }, + ("POST", "/api/sign-out") => { + if let Some((key, _)) = browser { + web.sign_out(&key); + } + let mut response = Response::json(200, me_json(None)); + response.set_cookie = Some(session_cookie("", 0)); + response + } + ("GET", "/api/status") => match browser { + Some((_, Browser { access: Access::SignedIn { by, since_ms, .. }, .. })) => Response::json(200, web.status_json(&by, since_ms)), + _ => Response::error(401), + }, + (_, "/" | "/app.js" | "/app.css" | "/api/me" | "/api/sign-in" | "/api/sign-in/qr.svg" | "/api/sign-out" | "/api/status") => { + Response::error(405) + } + _ => Response::error(404), + } +} + +fn me_json(browser: Option<&Browser>) -> String { + let now = now_ms(); + match browser.map(|b| &b.access) { + Some(Access::Pending { code, expires_ms }) => { + serde_json::json!({ "state": "pending", "code": code, "expiresInMs": expires_ms.saturating_sub(now) }) + } + Some(Access::SignedIn { by, since_ms, .. }) => serde_json::json!({ "state": "signed-in", "by": by, "since": since_ms }), + None => serde_json::json!({ "state": "signed-out" }), + } + .to_string() +} + +#[cfg(test)] +mod tests { + use super::*; + + fn web() -> (Rc, mpsc::UnboundedReceiver) { + let (tx, rx) = mpsc::unbounded_channel(); + (Web::new("npub1machine".into(), &["wss://box.tail1234.ts.net:7447".into()], tx), rx) + } + + fn request(method: &str, path: &str, host: &str) -> Request { + Request { + method: method.into(), + path: path.into(), + host: Some(host.into()), + origin: (method == "POST").then(|| format!("https://{host}")), + cookie: None, + } + } + + const PEER: IpAddr = IpAddr::V4(std::net::Ipv4Addr::new(192, 168, 1, 20)); + + #[test] + fn only_addresses_localhost_and_the_endpoints_hosts_are_served() { + let hosts = vec!["box.tail1234.ts.net".to_string()]; + for ok in ["192.168.1.5:7447", "localhost:7447", "[::1]:7447", "BOX.tail1234.ts.net:7447", "10.0.0.2"] { + assert!(host_allowed(ok, &hosts), "{ok}"); + } + for refused in ["evil.example:7447", "", "box.tail1234.ts.net.evil.example"] { + assert!(!host_allowed(refused, &hosts), "{refused}"); + } + } + + #[test] + fn a_post_from_another_origin_is_refused() { + let (web, _) = web(); + let mut post = request("POST", "/api/sign-in", "192.168.1.5:7447"); + post.origin = Some("https://evil.example".into()); + assert_eq!(route(&post, PEER, &web).status, 403); + post.origin = None; + assert_eq!(route(&post, PEER, &web).status, 403); + } + + #[test] + fn the_status_needs_a_signed_in_browser() { + let (web, mut inputs) = web(); + let host = "192.168.1.5:7447"; + assert_eq!(route(&request("GET", "/api/status", host), PEER, &web).status, 401); + + let started = route(&request("POST", "/api/sign-in", host), PEER, &web); + let cookie = started.set_cookie.clone().unwrap(); + assert!(cookie.contains("Secure") && cookie.contains("HttpOnly") && cookie.contains("SameSite=Strict")); + let token = cookie.split(';').next().unwrap().strip_prefix(&format!("{COOKIE}=")).unwrap().to_string(); + let Some(Input::WebSignInPending { code, .. }) = inputs.try_recv().ok() else { panic!("the engine is told the code") }; + + let mut status = request("GET", "/api/status", host); + status.cookie = Some(token.clone()); + assert_eq!(route(&status, PEER, &web).status, 401, "a pending browser sees no status"); + + web.signed_in(&code, "npub1owner"); + assert_eq!(route(&status, PEER, &web).status, 200); + + let mut out = request("POST", "/api/sign-out", host); + out.cookie = Some(token); + route(&out, PEER, &web); + assert_eq!(route(&status, PEER, &web).status, 401, "signed out"); + } + + #[test] + fn sign_in_starts_are_rate_limited_per_address() { + let (web, _) = web(); + for _ in 0..STARTS_PER_MINUTE { + assert!(web.start_sign_in(PEER).is_some()); + } + assert!(web.start_sign_in(PEER).is_none()); + assert!(web.start_sign_in(IpAddr::V4(std::net::Ipv4Addr::new(192, 168, 1, 21))).is_some()); + } + + #[test] + fn pending_sign_ins_are_capped() { + let (web, _) = web(); + for i in 0..(MAX_PENDING as u8 + 10) { + web.start_sign_in(IpAddr::V4(std::net::Ipv4Addr::new(10, 0, 0, i))).unwrap(); + } + assert!(web.browsers.borrow().len() <= MAX_PENDING); + } + + #[test] + fn a_code_is_two_unambiguous_groups() { + let code = new_code(); + assert_eq!(code.len(), 9); + assert!(code.chars().enumerate().all(|(i, c)| if i == 4 { c == '-' } else { CODE_ALPHABET.contains(&(c as u8)) })); + } + + #[test] + fn a_websocket_upgrade_is_told_apart_from_a_page_request() { + assert!(is_websocket(b"GET / HTTP/1.1\r\nHost: x\r\nUpgrade: websocket\r\nConnection: Upgrade\r\n\r\n")); + assert!(!is_websocket(b"GET / HTTP/1.1\r\nHost: x\r\n\r\n")); + assert_eq!(head_len(b"GET / HTTP/1.1\r\n\r\nbody"), Some(18)); + } +} diff --git a/crates/bridge-runtime/web/app.css b/crates/bridge-runtime/web/app.css new file mode 100644 index 00000000..bebcfa5b --- /dev/null +++ b/crates/bridge-runtime/web/app.css @@ -0,0 +1,94 @@ +/* The bridge's web page, in the app's own look: black, monochrome, white the + only accent; colour only for state (running, waiting, failed). */ +:root { + --bg: #000; + --surface: #0f0f10; + --raised: #161618; + --line: #242427; + --text: #ededee; + --dim: #8b8b90; + --muted: #5d5d62; + --ok: #4cc38a; + --busy: #e5b454; + --bad: #f2555a; + --radius: 14px; + font-family: "Inter", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif; + font-size: 15px; + color: var(--text); + background: var(--bg); +} + +* { box-sizing: border-box; } +body { margin: 0; min-height: 100vh; } +[hidden] { display: none !important; } + +.bar { + display: flex; align-items: center; justify-content: space-between; + padding: 14px 24px; border-bottom: 1px solid var(--line); + position: sticky; top: 0; background: rgba(0, 0, 0, 0.85); backdrop-filter: blur(8px); +} +.brand { display: flex; align-items: baseline; gap: 12px; min-width: 0; } +.mark { font-weight: 700; letter-spacing: -0.01em; } +.machine { color: var(--dim); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } + +main { max-width: 1080px; margin: 0 auto; padding: 24px; } +main.center { min-height: calc(100vh - 60px); display: flex; align-items: center; justify-content: center; } + +.card { background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius); padding: 20px 22px; margin-bottom: 16px; } +.card.narrow { max-width: 420px; width: 100%; text-align: center; } +.grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 16px; } +.grid .card { margin-bottom: 0; } +.grid { margin-bottom: 16px; } + +h1 { font-size: 22px; margin: 0 0 10px; letter-spacing: -0.01em; } +h2 { font-size: 13px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.06em; color: var(--dim); margin: 0 0 14px; } +.count { color: var(--muted); font-weight: 500; } +p { line-height: 1.5; } +.dim { color: var(--dim); } +.small { font-size: 13px; } +.error { color: var(--bad); } +.foot { text-align: center; margin-top: 24px; } + +button { font: inherit; border-radius: 999px; padding: 10px 18px; cursor: pointer; border: 1px solid var(--line); } +button.primary { background: var(--text); color: var(--bg); border-color: var(--text); font-weight: 600; margin-top: 8px; } +button.primary:hover { background: #fff; } +button.quiet { background: transparent; color: var(--dim); } +button.quiet:hover { color: var(--text); border-color: var(--muted); } + +.qr { width: 220px; height: 220px; border-radius: 12px; margin: 8px auto 14px; display: block; background: #fff; } +.code { font-family: ui-monospace, "JetBrains Mono", Menlo, Consolas, monospace; font-size: 30px; letter-spacing: 0.12em; margin: 4px 0 12px; } +.steps { text-align: left; padding-left: 20px; line-height: 1.7; margin: 0 0 10px; } + +.facts { display: grid; grid-template-columns: max-content 1fr; gap: 8px 18px; margin: 0; } +.facts dt { color: var(--dim); } +.facts dd { margin: 0; min-width: 0; overflow-wrap: anywhere; } +.mono { font-family: ui-monospace, "JetBrains Mono", Menlo, Consolas, monospace; font-size: 13px; } +.chips { display: flex; flex-wrap: wrap; gap: 6px; } +.chip { background: var(--raised); border: 1px solid var(--line); border-radius: 999px; padding: 2px 10px; font-size: 13px; color: var(--dim); } + +.agents { display: grid; grid-template-columns: repeat(auto-fill, minmax(230px, 1fr)); gap: 12px; } +.agent { background: var(--raised); border: 1px solid var(--line); border-radius: 12px; padding: 14px 16px; } +.agent-head { display: flex; justify-content: space-between; align-items: center; gap: 8px; margin-bottom: 8px; } +.agent-name { font-weight: 600; } +.agent .creds { display: flex; flex-direction: column; gap: 4px; font-size: 13px; color: var(--dim); } + +.state { display: inline-flex; align-items: center; gap: 6px; font-size: 13px; color: var(--dim); white-space: nowrap; } +.state::before { content: ""; width: 7px; height: 7px; border-radius: 50%; background: var(--muted); } +.state.ok::before { background: var(--ok); } +.state.busy::before { background: var(--busy); } +.state.bad::before { background: var(--bad); } + +.table-wrap { overflow-x: auto; } +table.sessions { width: 100%; border-collapse: collapse; } +.sessions th { text-align: left; font-weight: 500; color: var(--muted); font-size: 13px; padding: 0 12px 10px 0; border-bottom: 1px solid var(--line); } +.sessions td { padding: 11px 12px 11px 0; border-bottom: 1px solid var(--line); vertical-align: top; } +.sessions tr:last-child td { border-bottom: none; } +.sessions .title { max-width: 360px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } +.sessions .folder { color: var(--dim); max-width: 220px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } +.sessions .when { color: var(--dim); white-space: nowrap; } + +@media (max-width: 600px) { + main { padding: 16px; } + .bar { padding: 12px 16px; } + .sessions .folder, .sessions th:nth-child(4) { display: none; } +} diff --git a/crates/bridge-runtime/web/app.js b/crates/bridge-runtime/web/app.js new file mode 100644 index 00000000..52d448af --- /dev/null +++ b/crates/bridge-runtime/web/app.js @@ -0,0 +1,180 @@ +// The bridge's web page. Plain DOM, no dependencies: everything it loads is +// served by the bridge itself (its CSP allows nothing else). Text from the +// bridge is always set as text, never as HTML. +"use strict"; + +const views = ["loading", "signed-out", "pending", "dashboard"]; +let pollTimer = null; +let expiresAt = 0; + +const $ = (id) => document.getElementById(id); + +function show(view) { + for (const v of views) $(v).hidden = v !== view; + $("sign-out").hidden = view !== "dashboard"; +} + +async function api(path, method = "GET") { + const response = await fetch(path, { + method, + credentials: "same-origin", + headers: method === "POST" ? { "Content-Type": "application/json" } : {}, + body: method === "POST" ? "{}" : undefined, + }); + const body = await response.json().catch(() => ({})); + return { status: response.status, body }; +} + +function el(tag, attrs = {}, ...children) { + const node = document.createElement(tag); + for (const [k, v] of Object.entries(attrs)) { + if (k === "class") node.className = v; + else node.setAttribute(k, v); + } + for (const child of children) { + if (child == null) continue; + node.append(child instanceof Node ? child : document.createTextNode(String(child))); + } + return node; +} + +function schedule(fn, ms) { + clearTimeout(pollTimer); + pollTimer = setTimeout(fn, ms); +} + +async function refresh() { + let me; + try { + me = (await api("/api/me")).body; + } catch { + schedule(refresh, 3000); + return; + } + if (me.state === "signed-in") return dashboard(); + if (me.state === "pending") return pending(me); + show("signed-out"); +} + +async function start() { + $("start-error").hidden = true; + const { status, body } = await api("/api/sign-in", "POST"); + if (status === 429) { + $("start-error").textContent = "Too many sign-in attempts from here. Wait a minute and try again."; + $("start-error").hidden = false; + return; + } + if (status !== 200) { + $("start-error").textContent = "The bridge did not start a sign-in."; + $("start-error").hidden = false; + return; + } + pending(body); +} + +function pending(me) { + show("pending"); + if ($("code").textContent !== me.code) { + $("code").textContent = me.code; + $("qr").src = "/api/sign-in/qr.svg?code=" + encodeURIComponent(me.code); + } + expiresAt = Date.now() + me.expiresInMs; + tickExpiry(); + // Waiting for the phone: ask again until the browser is in or the code lapses. + schedule(refresh, 2000); +} + +function tickExpiry() { + const left = Math.max(0, Math.round((expiresAt - Date.now()) / 1000)); + $("expires").textContent = left > 0 ? `The code works for ${Math.floor(left / 60)}:${String(left % 60).padStart(2, "0")} more.` : "The code lapsed."; + if (left === 0) show("signed-out"); +} +setInterval(() => { if (!$("pending").hidden) tickExpiry(); }, 1000); + +function relative(iso) { + const at = typeof iso === "number" ? iso : Date.parse(iso); + if (!Number.isFinite(at)) return ""; + const s = Math.round((Date.now() - at) / 1000); + if (s < 60) return "just now"; + if (s < 3600) return `${Math.floor(s / 60)} min ago`; + if (s < 86400) return `${Math.floor(s / 3600)} h ago`; + return new Date(at).toLocaleDateString(); +} + +function stateOf(session) { + const state = session.state || "idle"; + const tone = { running: "busy", waiting: "busy", idle: "ok", error: "bad", offline: "" }[state] ?? ""; + return el("span", { class: `state ${tone}` }, state); +} + +function installOf(agent) { + const install = agent.install || {}; + switch (install.state) { + case "ready": return el("span", { class: "state ok" }, "ready"); + case "installing": return el("span", { class: "state busy" }, "installing"); + case "failed": return el("span", { class: "state bad", title: install.reason || "" }, "install failed"); + case "not_installed": return el("span", { class: "state" }, "not installed"); + default: return el("span", { class: "state" }, install.state || "unknown"); + } +} + +function credentialOf(c) { + const tone = c.present ? (c.valid === false ? "bad" : "ok") : ""; + const what = c.present ? (c.valid === false ? "invalid" : c.fromEnv ? "set (environment)" : "set") : "not set"; + return el("span", { class: `state ${tone}` }, `${c.label}: ${what}`); +} + +function facts(target, rows) { + target.replaceChildren(...rows.flatMap(([k, v]) => [el("dt", {}, k), el("dd", {}, v)])); +} + +async function dashboard() { + const { status, body } = await api("/api/status"); + if (status === 401) return refresh(); + if (status !== 200) return schedule(dashboard, 5000); + show("dashboard"); + const hb = body.heartbeat || {}; + $("machine").textContent = hb.machine || ""; + document.title = `${hb.machine || "Bridge"} · CodeDeck+`; + + facts($("bridge-facts"), [ + ["Machine", hb.machine || "—"], + ["Runs as", hb.host || "—"], + ["Identity", el("span", { class: "mono" }, body.machine)], + ["Capabilities", el("span", { class: "chips" }, ...(hb.capabilities || []).map((c) => el("span", { class: "chip" }, c)))], + ["Workspace", (hb.roots || []).join(", ") || "—"], + ...((hb.credentials || []).length ? [["Credentials", el("span", { class: "chips" }, ...hb.credentials.map(credentialOf))]] : []), + ]); + + const direct = hb.direct; + facts($("direct-facts"), direct ? [ + ["Phones dial", el("span", { class: "mono" }, (direct.endpoints || []).join("\n") || "no address advertised")], + ["Certificate", el("span", { class: "mono" }, (direct.certSha256 || "—").replace(/(..)(?!$)/g, "$1:"))], + ] : [["Status", "off"]]); + + $("agents").replaceChildren(...(hb.agents || []).map((agent) => el("div", { class: "agent" }, + el("div", { class: "agent-head" }, el("span", { class: "agent-name" }, agent.displayName), installOf(agent)), + el("div", { class: "creds" }, ...(agent.credentials || []).map(credentialOf)), + ))); + + const sessions = [...(hb.sessions || [])].sort((a, b) => Date.parse(b.lastActivity) - Date.parse(a.lastActivity)); + const agentName = Object.fromEntries((hb.agents || []).map((a) => [a.id, a.displayName])); + $("session-count").textContent = sessions.length ? String(sessions.length) : ""; + $("no-sessions").hidden = sessions.length > 0; + $("sessions").replaceChildren(...sessions.map((s) => el("tr", {}, + el("td", { class: "title", title: s.title || s.slug }, s.title || s.slug), + el("td", {}, agentName[s.agent] || s.agent), + el("td", {}, stateOf(s)), + el("td", { class: "folder", title: s.cwd }, s.project || s.cwd), + el("td", { class: "when" }, relative(s.lastActivity)), + ))); + $("signed-in-as").textContent = `Signed in by ${body.signedInBy.slice(0, 16)}… ${relative(body.signedInSince)}.`; + schedule(dashboard, 5000); +} + +$("start").addEventListener("click", start); +$("sign-out").addEventListener("click", async () => { + await api("/api/sign-out", "POST"); + show("signed-out"); +}); +refresh(); diff --git a/crates/bridge-runtime/web/index.html b/crates/bridge-runtime/web/index.html new file mode 100644 index 00000000..148564f5 --- /dev/null +++ b/crates/bridge-runtime/web/index.html @@ -0,0 +1,70 @@ + + + + + + +CodeDeck+ bridge + + + + +
+
CodeDeck+
+ +
+ +

Loading…

+ +
+
+

Sign in with your phone

+

This page shows what your bridge is doing. Only a phone paired with it can let a browser in — there is no password.

+ + +
+
+ +
+
+

Sign in with your phone

+ QR code of the sign-in code +

+
    +
  1. Open CodeDeck+ on a phone paired with this bridge.
  2. +
  3. On the machine's page, choose Sign in to the web page.
  4. +
  5. Scan this code, or type it.
  6. +
+

+
+
+ +
+
+
+

Bridge

+
+
+
+

Direct link

+
+
+
+
+

Agents

+
+
+
+

Sessions

+
+ + + +
SessionAgentStateFolderLast activity
+
+ +
+

+
+ + From 319f99ec1d1ae251b743ffbdac2282dbca25a736 Mon Sep 17 00:00:00 2001 From: deymosh <232244450+deymosh@users.noreply.github.com> Date: Fri, 16 Oct 2026 17:04:33 +0200 Subject: [PATCH 03/30] fix(bridge): the web page's address is logged where phones dial, not the bind address In a container the bind address is the container's own, which no browser on the host can reach; the page is on the direct link's listener, so it is wherever the bridge tells phones to dial. Co-Authored-By: Claude Code --- crates/bridge-runtime/src/direct.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/crates/bridge-runtime/src/direct.rs b/crates/bridge-runtime/src/direct.rs index 9ca035b9..0b228f89 100644 --- a/crates/bridge-runtime/src/direct.rs +++ b/crates/bridge-runtime/src/direct.rs @@ -294,7 +294,6 @@ pub async fn start( let bound = listener.local_addr().map_err(|e| e.to_string())?; bound_wss = Some(bound); log::info!("[Direct] Listening on wss://{bound} (certificate sha256 {})", cert.sha256_hex()); - log::info!("[Web] The bridge's web page is at https://{}/ (same certificate)", advertised(bound)); let hub = Rc::clone(&hub); let web = Rc::clone(&web); tasks.push(tokio::task::spawn_local(async move { @@ -317,6 +316,11 @@ pub async fn start( for endpoint in &endpoints { log::info!("[Direct] Advertising {endpoint}"); } + // The page is on the same `wss://` listener, so it is wherever phones + // are told to dial it (`localhost` too, on the machine itself). + for page in endpoints.iter().filter_map(|e| e.strip_prefix("wss://")) { + log::info!("[Web] The bridge's web page: https://{}/", page.trim_end_matches('/')); + } if endpoints.is_empty() { log::info!( "[Direct] Advertising no address: in a container the bridge sees only its own. \ From 0fc0195a06f1a34d45bd30a7523247ebc9a8f5fa Mon Sep 17 00:00:00 2001 From: deymosh <232244450+deymosh@users.noreply.github.com> Date: Fri, 16 Oct 2026 17:09:08 +0200 Subject: [PATCH 04/30] feat(bridge): plain http on the page's port redirects to https, and a development switch skips sign-in MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A browser that types `http://` reached the TLS listener and got TLS bytes it could not read ("invalid response"). The listener now peeks at the first byte: a TLS handshake opens with a handshake record, anything else is answered with a redirect to the same page over HTTPS — and only for a host the page would serve, so it redirects nowhere else. `CODEDECK_WEB_NO_SIGN_IN=1` lets a browser on a loopback or private address in without a phone sign-in, to work on the page before the phone side exists. It is off unless set, logs a warning at start, and the page shows a banner while it is on. It is for development and goes before the page ships. Co-Authored-By: Claude Code --- crates/bridge-runtime/src/direct.rs | 37 ++++++------ crates/bridge-runtime/src/web.rs | 85 +++++++++++++++++++++++++++- crates/bridge-runtime/web/app.css | 2 + crates/bridge-runtime/web/app.js | 1 + crates/bridge-runtime/web/index.html | 2 + docker-compose.yml | 3 + 6 files changed, 107 insertions(+), 23 deletions(-) diff --git a/crates/bridge-runtime/src/direct.rs b/crates/bridge-runtime/src/direct.rs index 0b228f89..3940883f 100644 --- a/crates/bridge-runtime/src/direct.rs +++ b/crates/bridge-runtime/src/direct.rs @@ -35,7 +35,7 @@ use protocol::direct::{ use protocol::kinds::{COMMAND_KIND, LIVE_KIND}; use protocol::nostr_event::SignedEvent; use sha2::{Digest, Sha256}; -use tokio::io::{AsyncRead, AsyncReadExt, AsyncWrite, ReadBuf}; +use tokio::io::{AsyncRead, AsyncWrite, ReadBuf}; use tokio::net::TcpListener; use tokio::sync::mpsc; use tokio::task::JoinHandle; @@ -297,9 +297,22 @@ pub async fn start( let hub = Rc::clone(&hub); let web = Rc::clone(&web); tasks.push(tokio::task::spawn_local(async move { + let pages = Rc::clone(&web); accept_loop(listener, hub, Some(web), move |stream| { let acceptor = acceptor.clone(); - async move { acceptor.accept(stream).await.ok() } + let pages = Rc::clone(&pages); + async move { + // A TLS handshake opens with a handshake record (0x16); + // anything else is a browser that typed `http://`, which + // is sent to the `https://` page rather than handed TLS + // bytes it cannot read. + let mut first = [0u8; 1]; + if matches!(stream.peek(&mut first).await, Ok(1) if first[0] != 0x16) { + crate::web::redirect_to_https(stream, &pages).await; + return None; + } + acceptor.accept(stream).await.ok() + } }) .await })); @@ -425,7 +438,7 @@ where /// request head, then hand a WebSocket upgrade to the direct link (with the /// bytes already read put back in front) and anything else to the page. async fn route(mut stream: S, peer: IpAddr, hub: &Hub, web: &crate::web::Web) { - let Ok(Some(head)) = tokio::time::timeout(HANDSHAKE_TIMEOUT, read_head(&mut stream)).await else { return }; + let Ok(Some(head)) = tokio::time::timeout(HANDSHAKE_TIMEOUT, crate::web::read_head(&mut stream)).await else { return }; if crate::web::is_websocket(&head) { serve(Replay { prefix: head, at: 0, inner: stream }, hub).await; } else { @@ -433,24 +446,6 @@ async fn route(mut stream: S, peer: IpAddr, h } } -/// Read until the request head is complete (with whatever followed it in the -/// same reads), or `None` past [`crate::web::MAX_HEAD_BYTES`] or at the end. -async fn read_head(stream: &mut S) -> Option> { - let mut buf = Vec::with_capacity(1024); - let mut chunk = [0u8; 2048]; - while crate::web::head_len(&buf).is_none() { - if buf.len() >= crate::web::MAX_HEAD_BYTES { - return None; - } - let read = stream.read(&mut chunk).await.ok()?; - if read == 0 { - return None; - } - buf.extend_from_slice(&chunk[..read]); - } - Some(buf) -} - /// A stream that yields `prefix` before reading on from `inner`: the request /// head [`route`] read to tell a WebSocket from a page, given back to the /// WebSocket handshake that needs it. diff --git a/crates/bridge-runtime/src/web.rs b/crates/bridge-runtime/src/web.rs index 5420144c..922debd3 100644 --- a/crates/bridge-runtime/src/web.rs +++ b/crates/bridge-runtime/src/web.rs @@ -101,11 +101,22 @@ pub struct Web { browsers: RefCell>, starts: RefCell>, inputs: mpsc::UnboundedSender, + /// Sign-in switched off for development (`CODEDECK_WEB_NO_SIGN_IN=1`): + /// a browser on a loopback or private address is let in without a + /// phone. Never on by default, logged loudly, and shown on the page. + no_sign_in: bool, } impl Web { pub fn new(machine_npub: String, endpoints: &[String], inputs: mpsc::UnboundedSender) -> Rc { let hosts = endpoints.iter().filter_map(|url| endpoint_host(url)).collect(); + let no_sign_in = std::env::var("CODEDECK_WEB_NO_SIGN_IN").is_ok_and(|v| v == "1"); + if no_sign_in { + log::warn!( + "[Web] SIGN-IN IS OFF (CODEDECK_WEB_NO_SIGN_IN=1): any browser on a loopback or private \ + address sees this bridge's page without a phone. For development only." + ); + } Rc::new(Self { machine_npub, hosts, @@ -113,6 +124,7 @@ impl Web { browsers: RefCell::default(), starts: RefCell::default(), inputs, + no_sign_in, }) } @@ -184,6 +196,7 @@ impl Web { "machine": self.machine_npub, "signedInBy": by, "signedInSince": since_ms, + "noSignIn": self.no_sign_in, "heartbeat": heartbeat.as_ref().map(|h| serde_json::to_value(h).unwrap_or(serde_json::Value::Null)), }) .to_string() @@ -360,6 +373,56 @@ fn session_cookie(token: &str, max_age_secs: u64) -> String { format!("{COOKIE}={token}; Path=/; Max-Age={max_age_secs}; Secure; HttpOnly; SameSite=Strict") } +/// Answer a plain-HTTP request that reached the TLS port with a redirect to +/// the same page over HTTPS. Nothing else is served in cleartext, and a +/// `Host` the page would refuse gets no redirect, so this is no open +/// redirector. +pub async fn redirect_to_https(mut stream: S, web: &Web) { + let Ok(Some(head)) = tokio::time::timeout(BODY_TIMEOUT, read_head(&mut stream)).await else { return }; + let mut headers = [httparse::EMPTY_HEADER; 64]; + let mut request = httparse::Request::new(&mut headers); + let host = match request.parse(&head) { + Ok(httparse::Status::Complete(_)) => { + request.headers.iter().find(|h| h.name.eq_ignore_ascii_case("host")).and_then(|h| std::str::from_utf8(h.value).ok()).map(str::to_string) + } + _ => None, + }; + let path = request.path.filter(|p| p.starts_with('/') && !p.starts_with("//")).unwrap_or("/"); + let reply = match host.filter(|h| host_allowed(h, &web.hosts)) { + Some(host) => format!("HTTP/1.1 301 Moved Permanently +Location: https://{host}{path} +Content-Length: 0 +Connection: close + +"), + None => "HTTP/1.1 400 Bad Request +Content-Length: 0 +Connection: close + +".to_string(), + }; + let _ = stream.write_all(reply.as_bytes()).await; + let _ = stream.shutdown().await; +} + +/// Read until the request head is complete (with whatever followed it in the +/// same reads), or `None` past [`MAX_HEAD_BYTES`] or at the end. +pub async fn read_head(stream: &mut S) -> Option> { + let mut buf = Vec::with_capacity(1024); + let mut chunk = [0u8; 2048]; + while head_len(&buf).is_none() { + if buf.len() >= MAX_HEAD_BYTES { + return None; + } + let read = stream.read(&mut chunk).await.ok()?; + if read == 0 { + return None; + } + buf.extend_from_slice(&chunk[..read]); + } + Some(buf) +} + /// Serve one page request whose head is in `buf`, from a browser at `peer`. pub async fn serve(buf: &[u8], mut stream: S, peer: IpAddr, web: &Web) { let response = match read_request(buf, &mut stream).await { @@ -376,7 +439,11 @@ fn route(request: &Request, peer: IpAddr, web: &Web) -> Response { if request.method == "POST" && request.origin.as_deref() != Some(&format!("https://{host}")) { return Response::error(403); } - let browser = web.browser(request.cookie.as_deref()); + let browser = if web.no_sign_in && is_local(peer) { + Some((String::new(), Browser { access: Access::SignedIn { by: "sign-in switched off".into(), since_ms: 0, expires_ms: u64::MAX }, peer, created_ms: 0 })) + } else { + web.browser(request.cookie.as_deref()) + }; match (request.method.as_str(), request.path.as_str()) { ("GET", "/") => Response::new(200, "text/html; charset=utf-8", INDEX_HTML), ("GET", "/app.js") => Response::new(200, "text/javascript; charset=utf-8", APP_JS), @@ -419,13 +486,27 @@ fn route(request: &Request, peer: IpAddr, web: &Web) -> Response { } } +/// Loopback, a private network (RFC 1918, unique-local IPv6) or link-local: +/// where the development switch lets a browser in without a phone. +fn is_local(ip: IpAddr) -> bool { + match ip { + IpAddr::V4(v4) => v4.is_loopback() || v4.is_private() || v4.is_link_local(), + IpAddr::V6(v6) => { + v6.is_loopback() || (v6.segments()[0] & 0xfe00) == 0xfc00 || (v6.segments()[0] & 0xffc0) == 0xfe80 + || v6.to_ipv4_mapped().is_some_and(|v4| v4.is_loopback() || v4.is_private()) + } + } +} + fn me_json(browser: Option<&Browser>) -> String { let now = now_ms(); match browser.map(|b| &b.access) { Some(Access::Pending { code, expires_ms }) => { serde_json::json!({ "state": "pending", "code": code, "expiresInMs": expires_ms.saturating_sub(now) }) } - Some(Access::SignedIn { by, since_ms, .. }) => serde_json::json!({ "state": "signed-in", "by": by, "since": since_ms }), + Some(Access::SignedIn { by, since_ms, expires_ms }) => { + serde_json::json!({ "state": "signed-in", "by": by, "since": since_ms, "noSignIn": *expires_ms == u64::MAX }) + } None => serde_json::json!({ "state": "signed-out" }), } .to_string() diff --git a/crates/bridge-runtime/web/app.css b/crates/bridge-runtime/web/app.css index bebcfa5b..6130e9f6 100644 --- a/crates/bridge-runtime/web/app.css +++ b/crates/bridge-runtime/web/app.css @@ -92,3 +92,5 @@ table.sessions { width: 100%; border-collapse: collapse; } .bar { padding: 12px 16px; } .sessions .folder, .sessions th:nth-child(4) { display: none; } } + +.banner { background: rgba(242, 85, 90, 0.12); color: var(--bad); border-bottom: 1px solid rgba(242, 85, 90, 0.4); padding: 10px 24px; font-size: 14px; text-align: center; } diff --git a/crates/bridge-runtime/web/app.js b/crates/bridge-runtime/web/app.js index 52d448af..756b2402 100644 --- a/crates/bridge-runtime/web/app.js +++ b/crates/bridge-runtime/web/app.js @@ -133,6 +133,7 @@ async function dashboard() { if (status === 401) return refresh(); if (status !== 200) return schedule(dashboard, 5000); show("dashboard"); + $("no-sign-in").hidden = !body.noSignIn; const hb = body.heartbeat || {}; $("machine").textContent = hb.machine || ""; document.title = `${hb.machine || "Bridge"} · CodeDeck+`; diff --git a/crates/bridge-runtime/web/index.html b/crates/bridge-runtime/web/index.html index 148564f5..009267dc 100644 --- a/crates/bridge-runtime/web/index.html +++ b/crates/bridge-runtime/web/index.html @@ -14,6 +14,8 @@ + +

Loading…

diff --git a/docker-compose.yml b/docker-compose.yml index e6a10549..c32c0f83 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -43,6 +43,9 @@ services: # 1 runs terminals (docs/TERMINAL.md): a shell an approved phone # drives. Off unless set; each phone is still approved on the machine. - CODEDECK_TERMINAL=${CODEDECK_TERMINAL:-} + # Development only: the web page lets in browsers on this network + # without a phone sign-in. Never set it on a bridge you rely on. + - CODEDECK_WEB_NO_SIGN_IN=${CODEDECK_WEB_NO_SIGN_IN:-} # The direct link: phones on your network (or VPN) reach the bridge here # without a relay. Only paired phones get past its handshake. ports: From b8e31f7647333463e6b7c73f2ecdfacc0d99c0ed Mon Sep 17 00:00:00 2001 From: deymosh <232244450+deymosh@users.noreply.github.com> Date: Fri, 16 Oct 2026 17:16:07 +0200 Subject: [PATCH 05/30] feat(client): a phone signs a browser in to its bridge's web page MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The wire already carries `web-sign-in` and its result; the phone now has the core plumbing behind them, in the shape the provider-profile ack already set. `UniffiIntent::WebSignIn` trims the code — whitespace is not a code, and an empty one is refused as an intent error rather than published — and the runtime sends the command on the ordinary signed path, recording `{code, Sending}` for that machine in the ui store. The bridge's answer moves that entry to `SignedIn` or `NotMatched` only when it names the code recorded now: an answer to an older code, from a retyped one or a screen that was reopened, is not about the attempt on screen, so it is dropped instead of reported. An unanswered `Sending` stays as it is — the screen showing the code times itself out, so silence is never turned into a verdict here. `ClearWebSignIn` forgets the entry when the screen closes, so a late answer cannot move something nothing is showing any more. `UniffiUiView.web_sign_in` carries the entry per machine; it is UI state only, never persisted, like the other ack statuses. Co-Authored-By: Claude Code --- .../main/java/uniffi/client_ffi/client_ffi.kt | 388 ++++++++++++++---- crates/client-core/src/stores/ui.rs | 100 +++++ crates/client-ffi/src/intent.rs | 57 +++ crates/client-ffi/src/views.rs | 47 +++ crates/client-runtime/src/dispatch.rs | 52 ++- crates/client-runtime/src/intent.rs | 75 +++- crates/client-runtime/src/runtime.rs | 1 + crates/client-runtime/src/view.rs | 12 +- 8 files changed, 644 insertions(+), 88 deletions(-) diff --git a/apps/android/app/src/main/java/uniffi/client_ffi/client_ffi.kt b/apps/android/app/src/main/java/uniffi/client_ffi/client_ffi.kt index 55bd8691..75e97ad7 100644 --- a/apps/android/app/src/main/java/uniffi/client_ffi/client_ffi.kt +++ b/apps/android/app/src/main/java/uniffi/client_ffi/client_ffi.kt @@ -8747,6 +8747,13 @@ data class UniffiUiView ( */ var `providerProfileStatus`: Map , + /** + * Keyed by machine pubkey: the code this phone sent to sign a browser in + * to that machine's web page, and where the round trip stands. Absent + * until a sign-in screen asks, and again once it closes. + */ + var `webSignIn`: Map + , /** * Present while a delete's undo window is open. */ @@ -8780,6 +8787,7 @@ public object FfiConverterTypeUniffiUiView: FfiConverterRustBuffer FfiConverterMapStringString.read(buf), FfiConverterMapStringTypeUniffiCredentialsAck.read(buf), FfiConverterMapStringTypeUniffiProviderProfileAck.read(buf), + FfiConverterMapStringTypeUniffiWebSignIn.read(buf), FfiConverterOptionalTypeUniffiUndoToast.read(buf), FfiConverterTypeUniffiTerminalsView.read(buf), ) @@ -8793,6 +8801,7 @@ public object FfiConverterTypeUniffiUiView: FfiConverterRustBuffer FfiConverterMapStringString.allocationSize(value.`planApprovalChoices`) + FfiConverterMapStringTypeUniffiCredentialsAck.allocationSize(value.`credentialsStatus`) + FfiConverterMapStringTypeUniffiProviderProfileAck.allocationSize(value.`providerProfileStatus`) + + FfiConverterMapStringTypeUniffiWebSignIn.allocationSize(value.`webSignIn`) + FfiConverterOptionalTypeUniffiUndoToast.allocationSize(value.`undoToast`) + FfiConverterTypeUniffiTerminalsView.allocationSize(value.`terminals`) ) @@ -8805,6 +8814,7 @@ public object FfiConverterTypeUniffiUiView: FfiConverterRustBuffer FfiConverterMapStringString.write(value.`planApprovalChoices`, buf) FfiConverterMapStringTypeUniffiCredentialsAck.write(value.`credentialsStatus`, buf) FfiConverterMapStringTypeUniffiProviderProfileAck.write(value.`providerProfileStatus`, buf) + FfiConverterMapStringTypeUniffiWebSignIn.write(value.`webSignIn`, buf) FfiConverterOptionalTypeUniffiUndoToast.write(value.`undoToast`, buf) FfiConverterTypeUniffiTerminalsView.write(value.`terminals`, buf) } @@ -8982,6 +8992,50 @@ public object FfiConverterTypeUniffiUsageWindow: FfiConverterRustBuffer { + override fun read(buf: ByteBuffer): UniffiWebSignIn { + return UniffiWebSignIn( + FfiConverterString.read(buf), + FfiConverterTypeUniffiWebSignInState.read(buf), + ) + } + + override fun allocationSize(value: UniffiWebSignIn) = ( + FfiConverterString.allocationSize(value.`code`) + + FfiConverterTypeUniffiWebSignInState.allocationSize(value.`state`) + ) + + override fun write(value: UniffiWebSignIn, buf: ByteBuffer) { + FfiConverterString.write(value.`code`, buf) + FfiConverterTypeUniffiWebSignInState.write(value.`state`, buf) + } +} + + + /** @@ -9875,6 +9929,33 @@ sealed class UniffiIntent { companion object } + /** + * Sign in the browser showing `code` on `machine`'s web page. The code + * is trimmed; surrounding whitespace never reaches the bridge. + */ + data class WebSignIn( + val `machine`: kotlin.String, + val `code`: kotlin.String) : UniffiIntent() + + { + + + companion object + } + + /** + * The sign-in screen closed: drop this machine's code and its answer, so + * a late one is not reported to a screen that is gone. + */ + data class ClearWebSignIn( + val `machine`: kotlin.String) : UniffiIntent() + + { + + + companion object + } + /** * Answer a permission request with one of its options' ids. */ @@ -10543,13 +10624,20 @@ public object FfiConverterTypeUniffiIntent : FfiConverterRustBuffer UniffiIntent.RespondPermission( + 27 -> UniffiIntent.WebSignIn( + FfiConverterString.read(buf), + FfiConverterString.read(buf), + ) + 28 -> UniffiIntent.ClearWebSignIn( + FfiConverterString.read(buf), + ) + 29 -> UniffiIntent.RespondPermission( FfiConverterString.read(buf), FfiConverterString.read(buf), FfiConverterString.read(buf), FfiConverterString.read(buf), ) - 28 -> UniffiIntent.AnswerQuestion( + 30 -> UniffiIntent.AnswerQuestion( FfiConverterString.read(buf), FfiConverterString.read(buf), FfiConverterString.read(buf), @@ -10557,90 +10645,90 @@ public object FfiConverterTypeUniffiIntent : FfiConverterRustBuffer UniffiIntent.RespondPlan( + 31 -> UniffiIntent.RespondPlan( FfiConverterString.read(buf), FfiConverterString.read(buf), FfiConverterString.read(buf), FfiConverterString.read(buf), FfiConverterOptionalString.read(buf), ) - 30 -> UniffiIntent.SetOption( + 32 -> UniffiIntent.SetOption( FfiConverterString.read(buf), FfiConverterString.read(buf), FfiConverterString.read(buf), FfiConverterString.read(buf), ) - 31 -> UniffiIntent.SelectSession( + 33 -> UniffiIntent.SelectSession( FfiConverterString.read(buf), FfiConverterOptionalString.read(buf), ) - 32 -> UniffiIntent.SetPlanApprovalChoice( + 34 -> UniffiIntent.SetPlanApprovalChoice( FfiConverterString.read(buf), FfiConverterString.read(buf), ) - 33 -> UniffiIntent.RetryOutboxItem( + 35 -> UniffiIntent.RetryOutboxItem( FfiConverterString.read(buf), FfiConverterString.read(buf), ) - 34 -> UniffiIntent.DeleteSession( + 36 -> UniffiIntent.DeleteSession( FfiConverterString.read(buf), FfiConverterString.read(buf), FfiConverterOptionalString.read(buf), ) - 35 -> UniffiIntent.UndoDelete - 36 -> UniffiIntent.SetTorEnabled( + 37 -> UniffiIntent.UndoDelete + 38 -> UniffiIntent.SetTorEnabled( FfiConverterBoolean.read(buf), ) - 37 -> UniffiIntent.SetStayConnected( + 39 -> UniffiIntent.SetStayConnected( FfiConverterBoolean.read(buf), ) - 38 -> UniffiIntent.SetBlossomServer( + 40 -> UniffiIntent.SetBlossomServer( FfiConverterString.read(buf), ) - 39 -> UniffiIntent.SetNotificationsEnabled( + 41 -> UniffiIntent.SetNotificationsEnabled( FfiConverterBoolean.read(buf), ) - 40 -> UniffiIntent.SetUiScale( + 42 -> UniffiIntent.SetUiScale( FfiConverterDouble.read(buf), ) - 41 -> UniffiIntent.SetShowUsageBadge( + 43 -> UniffiIntent.SetShowUsageBadge( FfiConverterBoolean.read(buf), ) - 42 -> UniffiIntent.SetShowCommitBadge( + 44 -> UniffiIntent.SetShowCommitBadge( FfiConverterBoolean.read(buf), ) - 43 -> UniffiIntent.AddQuickPrompt( + 45 -> UniffiIntent.AddQuickPrompt( FfiConverterString.read(buf), FfiConverterString.read(buf), FfiConverterString.read(buf), ) - 44 -> UniffiIntent.UpdateQuickPrompt( + 46 -> UniffiIntent.UpdateQuickPrompt( FfiConverterString.read(buf), FfiConverterString.read(buf), FfiConverterString.read(buf), ) - 45 -> UniffiIntent.RemoveQuickPrompt( + 47 -> UniffiIntent.RemoveQuickPrompt( FfiConverterString.read(buf), ) - 46 -> UniffiIntent.DismissPendingSession( + 48 -> UniffiIntent.DismissPendingSession( FfiConverterString.read(buf), ) - 47 -> UniffiIntent.RemoveMachine( + 49 -> UniffiIntent.RemoveMachine( FfiConverterString.read(buf), ) - 48 -> UniffiIntent.SetDirectEndpoints( + 50 -> UniffiIntent.SetDirectEndpoints( FfiConverterString.read(buf), FfiConverterSequenceString.read(buf), ) - 49 -> UniffiIntent.SetMachineRelays( + 51 -> UniffiIntent.SetMachineRelays( FfiConverterString.read(buf), FfiConverterSequenceString.read(buf), ) - 50 -> UniffiIntent.SetDefaultAgent( + 52 -> UniffiIntent.SetDefaultAgent( FfiConverterString.read(buf), FfiConverterOptionalString.read(buf), ) - 51 -> UniffiIntent.SetAgentDefaults( + 53 -> UniffiIntent.SetAgentDefaults( FfiConverterString.read(buf), FfiConverterString.read(buf), FfiConverterString.read(buf), @@ -10648,66 +10736,66 @@ public object FfiConverterTypeUniffiIntent : FfiConverterRustBuffer UniffiIntent.BeginPairing( + 54 -> UniffiIntent.BeginPairing( FfiConverterString.read(buf), FfiConverterString.read(buf), ) - 53 -> UniffiIntent.BeginManualPairing( + 55 -> UniffiIntent.BeginManualPairing( FfiConverterString.read(buf), FfiConverterString.read(buf), FfiConverterString.read(buf), FfiConverterString.read(buf), ) - 54 -> UniffiIntent.StagePairing( + 56 -> UniffiIntent.StagePairing( FfiConverterString.read(buf), ) - 55 -> UniffiIntent.ConfirmStagedPairing( + 57 -> UniffiIntent.ConfirmStagedPairing( FfiConverterString.read(buf), ) - 56 -> UniffiIntent.DismissStagedPairing - 57 -> UniffiIntent.ResetPairing - 58 -> UniffiIntent.SetBackupRelay( + 58 -> UniffiIntent.DismissStagedPairing + 59 -> UniffiIntent.ResetPairing + 60 -> UniffiIntent.SetBackupRelay( FfiConverterString.read(buf), ) - 59 -> UniffiIntent.BackupNow - 60 -> UniffiIntent.DisableBackup( + 61 -> UniffiIntent.BackupNow + 62 -> UniffiIntent.DisableBackup( FfiConverterBoolean.read(buf), ) - 61 -> UniffiIntent.OpenTerminal( + 63 -> UniffiIntent.OpenTerminal( FfiConverterString.read(buf), FfiConverterOptionalString.read(buf), FfiConverterUShort.read(buf), FfiConverterUShort.read(buf), ) - 62 -> UniffiIntent.AttachTerminal( + 64 -> UniffiIntent.AttachTerminal( FfiConverterString.read(buf), FfiConverterString.read(buf), ) - 63 -> UniffiIntent.DetachTerminal( + 65 -> UniffiIntent.DetachTerminal( FfiConverterString.read(buf), ) - 64 -> UniffiIntent.TerminalInput( + 66 -> UniffiIntent.TerminalInput( FfiConverterString.read(buf), FfiConverterString.read(buf), FfiConverterByteArray.read(buf), FfiConverterBoolean.read(buf), ) - 65 -> UniffiIntent.TerminalPaste( + 67 -> UniffiIntent.TerminalPaste( FfiConverterString.read(buf), FfiConverterString.read(buf), FfiConverterByteArray.read(buf), ) - 66 -> UniffiIntent.ResizeTerminal( + 68 -> UniffiIntent.ResizeTerminal( FfiConverterString.read(buf), FfiConverterString.read(buf), FfiConverterUShort.read(buf), FfiConverterUShort.read(buf), ) - 67 -> UniffiIntent.TakeOverTerminal( + 69 -> UniffiIntent.TakeOverTerminal( FfiConverterString.read(buf), FfiConverterString.read(buf), ) - 68 -> UniffiIntent.CloseTerminal( + 70 -> UniffiIntent.CloseTerminal( FfiConverterString.read(buf), FfiConverterString.read(buf), ) @@ -10952,6 +11040,21 @@ public object FfiConverterTypeUniffiIntent : FfiConverterRustBuffer { + // Add the size for the Int that specifies the variant plus the size needed for all fields + ( + 4UL + + FfiConverterString.allocationSize(value.`machine`) + + FfiConverterString.allocationSize(value.`code`) + ) + } + is UniffiIntent.ClearWebSignIn -> { + // Add the size for the Int that specifies the variant plus the size needed for all fields + ( + 4UL + + FfiConverterString.allocationSize(value.`machine`) + ) + } is UniffiIntent.RespondPermission -> { // Add the size for the Int that specifies the variant plus the size needed for all fields ( @@ -11480,16 +11583,27 @@ public object FfiConverterTypeUniffiIntent : FfiConverterRustBuffer { + is UniffiIntent.WebSignIn -> { buf.putInt(27) FfiConverterString.write(value.`machine`, buf) + FfiConverterString.write(value.`code`, buf) + Unit + } + is UniffiIntent.ClearWebSignIn -> { + buf.putInt(28) + FfiConverterString.write(value.`machine`, buf) + Unit + } + is UniffiIntent.RespondPermission -> { + buf.putInt(29) + FfiConverterString.write(value.`machine`, buf) FfiConverterString.write(value.`sessionId`, buf) FfiConverterString.write(value.`requestId`, buf) FfiConverterString.write(value.`optionId`, buf) Unit } is UniffiIntent.AnswerQuestion -> { - buf.putInt(28) + buf.putInt(30) FfiConverterString.write(value.`machine`, buf) FfiConverterString.write(value.`sessionId`, buf) FfiConverterString.write(value.`requestId`, buf) @@ -11499,7 +11613,7 @@ public object FfiConverterTypeUniffiIntent : FfiConverterRustBuffer { - buf.putInt(29) + buf.putInt(31) FfiConverterString.write(value.`machine`, buf) FfiConverterString.write(value.`sessionId`, buf) FfiConverterString.write(value.`requestId`, buf) @@ -11508,7 +11622,7 @@ public object FfiConverterTypeUniffiIntent : FfiConverterRustBuffer { - buf.putInt(30) + buf.putInt(32) FfiConverterString.write(value.`machine`, buf) FfiConverterString.write(value.`sessionId`, buf) FfiConverterString.write(value.`option`, buf) @@ -11516,118 +11630,118 @@ public object FfiConverterTypeUniffiIntent : FfiConverterRustBuffer { - buf.putInt(31) + buf.putInt(33) FfiConverterString.write(value.`machine`, buf) FfiConverterOptionalString.write(value.`sessionId`, buf) Unit } is UniffiIntent.SetPlanApprovalChoice -> { - buf.putInt(32) + buf.putInt(34) FfiConverterString.write(value.`cardId`, buf) FfiConverterString.write(value.`key`, buf) Unit } is UniffiIntent.RetryOutboxItem -> { - buf.putInt(33) + buf.putInt(35) FfiConverterString.write(value.`machine`, buf) FfiConverterString.write(value.`id`, buf) Unit } is UniffiIntent.DeleteSession -> { - buf.putInt(34) + buf.putInt(36) FfiConverterString.write(value.`machine`, buf) FfiConverterString.write(value.`sessionId`, buf) FfiConverterOptionalString.write(value.`label`, buf) Unit } is UniffiIntent.UndoDelete -> { - buf.putInt(35) + buf.putInt(37) Unit } is UniffiIntent.SetTorEnabled -> { - buf.putInt(36) + buf.putInt(38) FfiConverterBoolean.write(value.`enabled`, buf) Unit } is UniffiIntent.SetStayConnected -> { - buf.putInt(37) + buf.putInt(39) FfiConverterBoolean.write(value.`enabled`, buf) Unit } is UniffiIntent.SetBlossomServer -> { - buf.putInt(38) + buf.putInt(40) FfiConverterString.write(value.`url`, buf) Unit } is UniffiIntent.SetNotificationsEnabled -> { - buf.putInt(39) + buf.putInt(41) FfiConverterBoolean.write(value.`enabled`, buf) Unit } is UniffiIntent.SetUiScale -> { - buf.putInt(40) + buf.putInt(42) FfiConverterDouble.write(value.`scale`, buf) Unit } is UniffiIntent.SetShowUsageBadge -> { - buf.putInt(41) + buf.putInt(43) FfiConverterBoolean.write(value.`enabled`, buf) Unit } is UniffiIntent.SetShowCommitBadge -> { - buf.putInt(42) + buf.putInt(44) FfiConverterBoolean.write(value.`enabled`, buf) Unit } is UniffiIntent.AddQuickPrompt -> { - buf.putInt(43) + buf.putInt(45) FfiConverterString.write(value.`id`, buf) FfiConverterString.write(value.`label`, buf) FfiConverterString.write(value.`text`, buf) Unit } is UniffiIntent.UpdateQuickPrompt -> { - buf.putInt(44) + buf.putInt(46) FfiConverterString.write(value.`id`, buf) FfiConverterString.write(value.`label`, buf) FfiConverterString.write(value.`text`, buf) Unit } is UniffiIntent.RemoveQuickPrompt -> { - buf.putInt(45) + buf.putInt(47) FfiConverterString.write(value.`id`, buf) Unit } is UniffiIntent.DismissPendingSession -> { - buf.putInt(46) + buf.putInt(48) FfiConverterString.write(value.`pendingId`, buf) Unit } is UniffiIntent.RemoveMachine -> { - buf.putInt(47) + buf.putInt(49) FfiConverterString.write(value.`pubkeyHex`, buf) Unit } is UniffiIntent.SetDirectEndpoints -> { - buf.putInt(48) + buf.putInt(50) FfiConverterString.write(value.`machine`, buf) FfiConverterSequenceString.write(value.`endpoints`, buf) Unit } is UniffiIntent.SetMachineRelays -> { - buf.putInt(49) + buf.putInt(51) FfiConverterString.write(value.`machine`, buf) FfiConverterSequenceString.write(value.`relays`, buf) Unit } is UniffiIntent.SetDefaultAgent -> { - buf.putInt(50) + buf.putInt(52) FfiConverterString.write(value.`machine`, buf) FfiConverterOptionalString.write(value.`agent`, buf) Unit } is UniffiIntent.SetAgentDefaults -> { - buf.putInt(51) + buf.putInt(53) FfiConverterString.write(value.`machine`, buf) FfiConverterString.write(value.`agent`, buf) FfiConverterString.write(value.`mode`, buf) @@ -11637,13 +11751,13 @@ public object FfiConverterTypeUniffiIntent : FfiConverterRustBuffer { - buf.putInt(52) + buf.putInt(54) FfiConverterString.write(value.`url`, buf) FfiConverterString.write(value.`label`, buf) Unit } is UniffiIntent.BeginManualPairing -> { - buf.putInt(53) + buf.putInt(55) FfiConverterString.write(value.`npub`, buf) FfiConverterString.write(value.`token`, buf) FfiConverterString.write(value.`relays`, buf) @@ -11651,39 +11765,39 @@ public object FfiConverterTypeUniffiIntent : FfiConverterRustBuffer { - buf.putInt(54) + buf.putInt(56) FfiConverterString.write(value.`url`, buf) Unit } is UniffiIntent.ConfirmStagedPairing -> { - buf.putInt(55) + buf.putInt(57) FfiConverterString.write(value.`label`, buf) Unit } is UniffiIntent.DismissStagedPairing -> { - buf.putInt(56) + buf.putInt(58) Unit } is UniffiIntent.ResetPairing -> { - buf.putInt(57) + buf.putInt(59) Unit } is UniffiIntent.SetBackupRelay -> { - buf.putInt(58) + buf.putInt(60) FfiConverterString.write(value.`url`, buf) Unit } is UniffiIntent.BackupNow -> { - buf.putInt(59) + buf.putInt(61) Unit } is UniffiIntent.DisableBackup -> { - buf.putInt(60) + buf.putInt(62) FfiConverterBoolean.write(value.`delete`, buf) Unit } is UniffiIntent.OpenTerminal -> { - buf.putInt(61) + buf.putInt(63) FfiConverterString.write(value.`machine`, buf) FfiConverterOptionalString.write(value.`session`, buf) FfiConverterUShort.write(value.`cols`, buf) @@ -11691,18 +11805,18 @@ public object FfiConverterTypeUniffiIntent : FfiConverterRustBuffer { - buf.putInt(62) + buf.putInt(64) FfiConverterString.write(value.`machine`, buf) FfiConverterString.write(value.`term`, buf) Unit } is UniffiIntent.DetachTerminal -> { - buf.putInt(63) + buf.putInt(65) FfiConverterString.write(value.`machine`, buf) Unit } is UniffiIntent.TerminalInput -> { - buf.putInt(64) + buf.putInt(66) FfiConverterString.write(value.`machine`, buf) FfiConverterString.write(value.`term`, buf) FfiConverterByteArray.write(value.`bytes`, buf) @@ -11710,14 +11824,14 @@ public object FfiConverterTypeUniffiIntent : FfiConverterRustBuffer { - buf.putInt(65) + buf.putInt(67) FfiConverterString.write(value.`machine`, buf) FfiConverterString.write(value.`term`, buf) FfiConverterByteArray.write(value.`bytes`, buf) Unit } is UniffiIntent.ResizeTerminal -> { - buf.putInt(66) + buf.putInt(68) FfiConverterString.write(value.`machine`, buf) FfiConverterString.write(value.`term`, buf) FfiConverterUShort.write(value.`cols`, buf) @@ -11725,13 +11839,13 @@ public object FfiConverterTypeUniffiIntent : FfiConverterRustBuffer { - buf.putInt(67) + buf.putInt(69) FfiConverterString.write(value.`machine`, buf) FfiConverterString.write(value.`term`, buf) Unit } is UniffiIntent.CloseTerminal -> { - buf.putInt(68) + buf.putInt(70) FfiConverterString.write(value.`machine`, buf) FfiConverterString.write(value.`term`, buf) Unit @@ -11756,6 +11870,19 @@ sealed class UniffiIntentException: kotlin.Exception() { get() = "detail=${ `detail` }" } + /** + * The intent needs this value and got nothing (whitespace counts as + * nothing): there is no command to send without it, so it is refused + * here rather than published as an empty field. + */ + class EmptyValue( + + val `field`: kotlin.String + ) : UniffiIntentException() { + override val message + get() = "field=${ `field` }" + } + @@ -11778,6 +11905,9 @@ public object FfiConverterTypeUniffiIntentError : FfiConverterRustBuffer UniffiIntentException.BadEnumValue( FfiConverterString.read(buf), ) + 2 -> UniffiIntentException.EmptyValue( + FfiConverterString.read(buf), + ) else -> throw RuntimeException("invalid error enum value, something is very wrong!!") } } @@ -11789,6 +11919,11 @@ public object FfiConverterTypeUniffiIntentError : FfiConverterRustBuffer ( + // Add the size for the Int that specifies the variant plus the size needed for all fields + 4UL + + FfiConverterString.allocationSize(value.`field`) + ) } } @@ -11799,6 +11934,11 @@ public object FfiConverterTypeUniffiIntentError : FfiConverterRustBuffer { + buf.putInt(2) + FfiConverterString.write(value.`field`, buf) + Unit + } }.let { /* this makes the `when` an expression, which ensures it is exhaustive */ } } @@ -12066,6 +12206,47 @@ public object FfiConverterTypeUniffiUserMessageShape : FfiConverterRustBuffer { + override fun read(buf: ByteBuffer) = try { + UniffiWebSignInState.values()[buf.getInt() - 1] + } catch (e: IndexOutOfBoundsException) { + throw RuntimeException("invalid enum value, something is very wrong!!", e) + } + + override fun allocationSize(value: UniffiWebSignInState) = 4UL + + override fun write(value: UniffiWebSignInState, buf: ByteBuffer) { + buf.putInt(value.ordinal + 1) + } +} + + + + + /** * @suppress @@ -14415,6 +14596,45 @@ public object FfiConverterMapStringTypeUniffiProviderProfileAck: FfiConverterRus +/** + * @suppress + */ +public object FfiConverterMapStringTypeUniffiWebSignIn: FfiConverterRustBuffer> { + override fun read(buf: ByteBuffer): Map { + val len = buf.getInt() + return buildMap(len) { + repeat(len) { + val k = FfiConverterString.read(buf) + val v = FfiConverterTypeUniffiWebSignIn.read(buf) + this[k] = v + } + } + } + + override fun allocationSize(value: Map): ULong { + val spaceForMapSize = 4UL + val spaceForChildren = value.map { (k, v) -> + FfiConverterString.allocationSize(k) + + FfiConverterTypeUniffiWebSignIn.allocationSize(v) + }.sum() + return spaceForMapSize + spaceForChildren + } + + override fun write(value: Map, buf: ByteBuffer) { + buf.putInt(value.size) + // The parens on `(k, v)` here ensure we're calling the right method, + // which is important for compatibility with older android devices. + // Ref https://blog.danlew.net/2017/03/16/kotlin-puzzler-whose-line-is-it-anyways/ + value.forEach { (k, v) -> + FfiConverterString.write(k, buf) + FfiConverterTypeUniffiWebSignIn.write(v, buf) + } + } +} + + + + /** * @suppress */ diff --git a/crates/client-core/src/stores/ui.rs b/crates/client-core/src/stores/ui.rs index 2611ec1a..ee335857 100644 --- a/crates/client-core/src/stores/ui.rs +++ b/crates/client-core/src/stores/ui.rs @@ -56,6 +56,26 @@ pub struct ProviderProfileAck { pub error: Option, } +/// Where a `web-sign-in` round trip for one machine stands. `Sending` with no +/// answer stays `Sending` — the screen showing the code is the one that times +/// itself out, so nothing here turns silence into a verdict. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, specta::Type)] +#[serde(rename_all = "lowercase")] +pub enum WebSignInState { + Sending, + SignedIn, + NotMatched, +} + +/// The code a phone sent to sign a browser in to a machine's web page, kept +/// so the bridge's answer can be matched to the attempt it belongs to. +#[derive(Debug, Clone, PartialEq, Eq, Serialize, specta::Type)] +#[serde(rename_all = "camelCase")] +pub struct WebSignIn { + pub code: String, + pub state: WebSignInState, +} + /// The bottom "Deleted X — Undo" toast for a pending session delete. The /// [`crate::delete_controller`] owns its 4 s lifecycle; this is only what the UI /// renders. @@ -116,6 +136,8 @@ pub struct UiState { pub plan_approval_choices: BTreeMap, pub credentials_status: BTreeMap, pub provider_profile_status: BTreeMap, + /// machine pubkey → the `web-sign-in` the phone last sent there. + pub web_sign_in: BTreeMap, pub undo_toast: Option, } @@ -264,6 +286,44 @@ impl UiState { pub fn set_undo_toast(&mut self, toast: Option) { self.undo_toast = toast; } + + /// A `web-sign-in` left for this machine: the code the phone is asking the + /// bridge to honour, remembered verbatim so the answer can be matched to + /// this attempt and not to a later one. + pub fn note_web_sign_in_sent(&mut self, machine_pubkey: &str, code: &str) { + self.web_sign_in.insert( + machine_pubkey.to_string(), + WebSignIn { + code: code.to_string(), + state: WebSignInState::Sending, + }, + ); + } + + /// The bridge's answer to a `web-sign-in` on this machine, which moves the + /// entry only when it answers the code recorded now — an answer to an + /// older code says nothing about the attempt on screen. Whether the entry + /// moved. + pub fn apply_web_sign_in_result(&mut self, machine_pubkey: &str, code: &str, signed_in: bool) -> bool { + let Some(entry) = self.web_sign_in.get_mut(machine_pubkey) else { + return false; + }; + if entry.code != code { + return false; + } + entry.state = if signed_in { + WebSignInState::SignedIn + } else { + WebSignInState::NotMatched + }; + true + } + + /// The sign-in screen closed: forget this machine's code. Whether there + /// was one. + pub fn clear_web_sign_in(&mut self, machine_pubkey: &str) -> bool { + self.web_sign_in.remove(machine_pubkey).is_some() + } } #[cfg(test)] @@ -390,6 +450,46 @@ mod tests { assert_eq!(ack.token_valid, Some(false)); } + #[test] + fn a_web_sign_in_answer_moves_only_the_code_it_answers() { + let mut ui = UiState::default(); + ui.note_web_sign_in_sent("m", "K7QM-4XPA"); + assert_eq!(ui.web_sign_in["m"].state, WebSignInState::Sending); + + assert!(ui.apply_web_sign_in_result("m", "K7QM-4XPA", true)); + assert_eq!(ui.web_sign_in["m"].state, WebSignInState::SignedIn); + assert_eq!(ui.web_sign_in["m"].code, "K7QM-4XPA"); + + // A refusal lands too, and on the same terms. + ui.note_web_sign_in_sent("m", "AAAA-BBBB"); + assert!(ui.apply_web_sign_in_result("m", "AAAA-BBBB", false)); + assert_eq!(ui.web_sign_in["m"].state, WebSignInState::NotMatched); + } + + #[test] + fn a_late_answer_to_an_older_code_is_ignored() { + let mut ui = UiState::default(); + ui.note_web_sign_in_sent("m", "OLD1-CODE"); + ui.note_web_sign_in_sent("m", "NEW1-CODE"); + + assert!(!ui.apply_web_sign_in_result("m", "OLD1-CODE", true), "not this attempt's answer"); + assert_eq!(ui.web_sign_in["m"].state, WebSignInState::Sending); + assert_eq!(ui.web_sign_in["m"].code, "NEW1-CODE"); + + // An answer with no entry at all (the screen closed) is ignored too. + assert!(!ui.apply_web_sign_in_result("other", "NEW1-CODE", true)); + } + + #[test] + fn clearing_a_web_sign_in_reports_whether_there_was_one() { + let mut ui = UiState::default(); + assert!(!ui.clear_web_sign_in("m")); + ui.note_web_sign_in_sent("m", "K7QM-4XPA"); + assert!(ui.clear_web_sign_in("m")); + assert!(!ui.web_sign_in.contains_key("m")); + assert!(!ui.clear_web_sign_in("m")); + } + #[test] fn undo_toast_is_a_plain_slot() { let mut ui = UiState::default(); diff --git a/crates/client-ffi/src/intent.rs b/crates/client-ffi/src/intent.rs index 3e55362a..75f3b826 100644 --- a/crates/client-ffi/src/intent.rs +++ b/crates/client-ffi/src/intent.rs @@ -329,6 +329,17 @@ pub enum UniffiIntent { profile_id: String, profile: Option, }, + /// Sign in the browser showing `code` on `machine`'s web page. The code + /// is trimmed; surrounding whitespace never reaches the bridge. + WebSignIn { + machine: String, + code: String, + }, + /// The sign-in screen closed: drop this machine's code and its answer, so + /// a late one is not reported to a screen that is gone. + ClearWebSignIn { + machine: String, + }, /// Answer a permission request with one of its options' ids. RespondPermission { machine: String, @@ -565,6 +576,11 @@ pub enum UniffiIntent { pub enum UniffiIntentError { #[error("not a recognized value for this field: {detail}")] BadEnumValue { detail: String }, + /// The intent needs this value and got nothing (whitespace counts as + /// nothing): there is no command to send without it, so it is refused + /// here rather than published as an empty field. + #[error("this intent needs a value for {field}")] + EmptyValue { field: String }, } fn parse_enum(field: &str, s: &str) -> Result { @@ -684,6 +700,14 @@ impl TryFrom for Intent { default_model: p.default_model, }), }, + UniffiIntent::WebSignIn { machine, code } => { + let code = code.trim().to_string(); + if code.is_empty() { + return Err(UniffiIntentError::EmptyValue { field: "code".into() }); + } + Intent::WebSignIn { machine, code } + } + UniffiIntent::ClearWebSignIn { machine } => Intent::ClearWebSignIn { machine }, UniffiIntent::RespondPermission { machine, session_id, request_id, option_id } => { Intent::RespondPermission { machine, session_id, request_id, option_id } } @@ -968,6 +992,39 @@ mod tests { assert_eq!(mapped, Intent::SetProviderProfile { machine: "m".into(), profile_id: "kimi-k3".into(), profile: None }); } + #[test] + fn web_sign_in_trims_the_code_and_refuses_an_empty_one() { + let mapped: Intent = UniffiIntent::WebSignIn { + machine: "m".into(), + code: " k7qm-4xpa ".into(), + } + .try_into() + .unwrap(); + assert_eq!( + mapped, + Intent::WebSignIn { + machine: "m".into(), + code: "k7qm-4xpa".into() + } + ); + + // Whitespace is not a code: there is nothing to ask the bridge for. + for empty in ["", " "] { + let err = Intent::try_from(UniffiIntent::WebSignIn { + machine: "m".into(), + code: empty.into(), + }) + .unwrap_err(); + assert!(matches!(err, UniffiIntentError::EmptyValue { .. }), "{empty:?} -> {err:?}"); + } + } + + #[test] + fn clear_web_sign_in_maps_to_the_store_action() { + let mapped: Intent = UniffiIntent::ClearWebSignIn { machine: "m".into() }.try_into().unwrap(); + assert_eq!(mapped, Intent::ClearWebSignIn { machine: "m".into() }); + } + #[test] fn delete_session_maps_field_for_field() { let intent = UniffiIntent::DeleteSession { diff --git a/crates/client-ffi/src/views.rs b/crates/client-ffi/src/views.rs index 82da86e2..8c87f273 100644 --- a/crates/client-ffi/src/views.rs +++ b/crates/client-ffi/src/views.rs @@ -37,6 +37,7 @@ use client_runtime::client_core::presentation::activity::build_activity; use client_runtime::client_core::presentation::display_entries::{ build_display_entries, find_pending_permission, DisplayEntry, SeqEntry, }; +use client_runtime::client_core::stores::ui::WebSignInState; use client_runtime::{ MachinesView, OutboxView, PairingView, PendingSessionsView, QuickPromptsView, SettingsView, TranscriptRowsView, UiView, @@ -1242,6 +1243,35 @@ pub struct UniffiProviderProfileAck { pub error: Option, } +/// Where a `web-sign-in` round trip for one machine stands — mirrors +/// `client_core::stores::ui::WebSignInState`. `Sending` that is never answered +/// stays `Sending`: the screen showing the code is the one that times itself +/// out, so silence is never reported here as a refusal. +#[derive(Debug, Clone, Copy, PartialEq, Eq, uniffi::Enum)] +pub enum UniffiWebSignInState { + Sending, + SignedIn, + NotMatched, +} + +/// The code a phone sent to sign a browser in to a machine's web page, and +/// where that round trip stands — mirrors `client_core::stores::ui::WebSignIn` +/// field for field. `code` is the one the phone sent, which is what the +/// bridge's answer has to name for this entry to move. +#[derive(Debug, Clone, PartialEq, Eq, uniffi::Record)] +pub struct UniffiWebSignIn { + pub code: String, + pub state: UniffiWebSignInState, +} + +fn to_uniffi_web_sign_in_state(state: WebSignInState) -> UniffiWebSignInState { + match state { + WebSignInState::Sending => UniffiWebSignInState::Sending, + WebSignInState::SignedIn => UniffiWebSignInState::SignedIn, + WebSignInState::NotMatched => UniffiWebSignInState::NotMatched, + } +} + /// The bottom "Deleted X — Undo" toast after an optimistic session delete — /// mirrors `client_core::stores::ui::UndoToast` field for field. Present /// only while the 4 s undo window is open; the hide lands as the next @@ -1268,6 +1298,10 @@ pub struct UniffiUiView { pub credentials_status: HashMap, /// Keyed by machine pubkey. pub provider_profile_status: HashMap, + /// Keyed by machine pubkey: the code this phone sent to sign a browser in + /// to that machine's web page, and where the round trip stands. Absent + /// until a sign-in screen asks, and again once it closes. + pub web_sign_in: HashMap, /// Present while a delete's undo window is open. pub undo_toast: Option, /// The terminals, low-frequency state only — output frames arrive on @@ -1394,6 +1428,19 @@ pub fn build_uniffi_ui_view(v: &UiView) -> UniffiUiView { ) }) .collect(), + web_sign_in: v + .web_sign_in + .iter() + .map(|(k, w)| { + ( + k.clone(), + UniffiWebSignIn { + code: w.code.clone(), + state: to_uniffi_web_sign_in_state(w.state), + }, + ) + }) + .collect(), undo_toast: v.undo_toast.clone().map(|t| UniffiUndoToast { machine: t.machine, session_id: t.session_id, diff --git a/crates/client-runtime/src/dispatch.rs b/crates/client-runtime/src/dispatch.rs index 235857c5..ecd30d2d 100644 --- a/crates/client-runtime/src/dispatch.rs +++ b/crates/client-runtime/src/dispatch.rs @@ -516,8 +516,18 @@ impl<'a> Router<'a> { r.persist(StoreId::Machines); } } - // Shown by the screen that sent the code, which waits for it. - BridgeToPhone::WebSignInResult(_) => {} + BridgeToPhone::WebSignInResult(m) => { + // An answer to a code the screen is no longer showing says + // nothing about what it shows now, so the store keeps its + // entry and this asks for no re-fetch. + if self + .stores + .ui + .apply_web_sign_in_result(machine, &m.code, m.signed_in) + { + r.ui_changed = true; + } + } BridgeToPhone::ProviderProfileAck(m) => { self.stores.ui.apply_provider_profile_ack( machine, @@ -1590,6 +1600,44 @@ mod tests { assert_eq!(s.machines.machine(MACHINE).unwrap().credentials[0].valid, Some(true)); } + #[tokio::test] + async fn a_web_sign_in_result_moves_the_code_it_answers_and_no_other() { + let (mut s, ts, kp) = stores().await; + s.ui.note_web_sign_in_sent(MACHINE, "K7QM-4XPA"); + + // The answer names a code other than the one on screen — the screen + // closed and reopened, or the user retyped — so it is not about this + // attempt and the entry stays where it is. + let stale = BridgeToPhone::WebSignInResult(protocol::events::WebSignInResultMsg { + code: "OLD1-CODE".into(), + signed_in: true, + }); + let mut r = Router::new(&mut s, &ts, &kp, 1_000); + let out = r.route(MACHINE, &stale).await; + assert!(!out.ui_changed); + assert_eq!( + s.ui.web_sign_in[MACHINE].state, + client_core::stores::ui::WebSignInState::Sending + ); + + let answered = BridgeToPhone::WebSignInResult(protocol::events::WebSignInResultMsg { + code: "K7QM-4XPA".into(), + signed_in: true, + }); + let mut r = Router::new(&mut s, &ts, &kp, 2_000); + let out = r.route(MACHINE, &answered).await; + assert!(out.ui_changed); + assert_eq!( + s.ui.web_sign_in[MACHINE].state, + client_core::stores::ui::WebSignInState::SignedIn + ); + + // The screen closed before the answer came back: nothing to report. + s.ui.clear_web_sign_in(MACHINE); + let mut r = Router::new(&mut s, &ts, &kp, 3_000); + assert!(!r.route(MACHINE, &answered).await.ui_changed); + } + #[tokio::test] async fn models_updates_the_agents_list_and_asks_for_a_persist() { let (mut s, ts, kp) = stores().await; diff --git a/crates/client-runtime/src/intent.rs b/crates/client-runtime/src/intent.rs index 81dc671c..3c1a8f97 100644 --- a/crates/client-runtime/src/intent.rs +++ b/crates/client-runtime/src/intent.rs @@ -21,7 +21,7 @@ use protocol::commands::{ AccountActionMsg, AccountsRequestMsg, AgentActionMsg, BareMsg, CreateFolderMsg, CreateSessionMsg, InputMsg, McpActionMsg, McpRequestMsg, ModelsRequestMsg, PermissionResponseMsg, PermissionRulesRemoveMsg, PermissionRulesRequestMsg, PersonasRequestMsg, PhoneToBridge, PlanResponseMsg, PluginActionMsg, PluginsRequestMsg, ProviderProfileWrite, QuestionAnswer, QuestionResponseMsg, SessionIdMsg, SessionMcpToggleMsg, SetCredentialsMsg, SetOptionMsg, SetProviderProfileMsg, - StopTaskMsg, TerminalIdMsg, TerminalResizeMsg, + StopTaskMsg, TerminalIdMsg, TerminalResizeMsg, WebSignInMsg, }; use protocol::common::{AccountAction, AgentAction, CredentialValues, McpAction, McpServerSpec, PluginAction, SessionOption}; use protocol::events::McpAckMsg; @@ -434,6 +434,20 @@ pub enum Intent { RequestProviderProfiles { machine: String, }, + /// Sign in the browser showing `code` on this machine's web page: the + /// signature on the command is what lets it in, so the code alone is + /// worthless to anyone else. Answered with + /// `BridgeToPhone::WebSignInResult`, taken only when it answers the code + /// the ui store recorded for this attempt. + WebSignIn { + machine: String, + code: String, + }, + /// The sign-in screen closed: forget this machine's code, so a late + /// answer cannot move an entry nothing is showing any more. + ClearWebSignIn { + machine: String, + }, /// Create a new project folder under a workspace root (and `git init` it, /// bridge-side). Answered with `CoreEvent::FolderAck`, matched by /// `request_id` — the caller mints it (a UUID is fine; the bridge only @@ -966,6 +980,16 @@ pub fn apply( r.send(&machine, PhoneToBridge::ProviderProfilesRequest(BareMsg {})) } } + Intent::WebSignIn { machine, code } => { + stores.ui.note_web_sign_in_sent(&machine, &code); + r.ui_changed = true; + r.send(&machine, PhoneToBridge::WebSignIn(WebSignInMsg { code })); + } + Intent::ClearWebSignIn { machine } => { + if stores.ui.clear_web_sign_in(&machine) { + r.ui_changed = true; + } + } Intent::CreateFolder { machine, path, @@ -1702,6 +1726,55 @@ mod tests { )); } + #[tokio::test] + async fn web_sign_in_sends_the_code_and_records_it_until_answered() { + let (mut s, kp) = stores().await; + let out = apply( + &mut s, + Intent::WebSignIn { + machine: "m".into(), + code: "K7QM-4XPA".into(), + }, + &kp, + ctx(), + ); + assert!(matches!( + out.sends.as_slice(), + [Send { machine, msg: PhoneToBridge::WebSignIn(m) }] + if machine == "m" && m.code == "K7QM-4XPA" + )); + assert!(out.ui_changed, "the sign-in screen reads the entry back"); + assert_eq!(s.ui.web_sign_in["m"].code, "K7QM-4XPA"); + assert_eq!( + s.ui.web_sign_in["m"].state, + client_core::stores::ui::WebSignInState::Sending, + "silence is not a verdict; the screen times itself out" + ); + } + + #[tokio::test] + async fn clearing_a_web_sign_in_sends_nothing_and_reports_its_own_change() { + let (mut s, kp) = stores().await; + apply( + &mut s, + Intent::WebSignIn { + machine: "m".into(), + code: "K7QM-4XPA".into(), + }, + &kp, + ctx(), + ); + + let out = apply(&mut s, Intent::ClearWebSignIn { machine: "m".into() }, &kp, ctx()); + assert!(out.sends.is_empty()); + assert!(out.ui_changed); + assert!(!s.ui.web_sign_in.contains_key("m")); + + // Nothing left to forget: no re-fetch for a screen that is gone. + let out = apply(&mut s, Intent::ClearWebSignIn { machine: "m".into() }, &kp, ctx()); + assert!(!out.ui_changed); + } + /// Screens ask each time they open; the profiles, which the bridge /// pushes on every change, are not asked for twice. #[tokio::test] diff --git a/crates/client-runtime/src/runtime.rs b/crates/client-runtime/src/runtime.rs index 54b6e413..d804085c 100644 --- a/crates/client-runtime/src/runtime.rs +++ b/crates/client-runtime/src/runtime.rs @@ -710,6 +710,7 @@ impl Core { plan_approval_choices: Default::default(), credentials_status: Default::default(), provider_profile_status: Default::default(), + web_sign_in: Default::default(), undo_toast: None, terminals: Default::default(), }) diff --git a/crates/client-runtime/src/view.rs b/crates/client-runtime/src/view.rs index 01dfbd51..4a3e94e6 100644 --- a/crates/client-runtime/src/view.rs +++ b/crates/client-runtime/src/view.rs @@ -22,7 +22,7 @@ use client_core::stores::pending_sessions::PendingSessionView; use client_core::stores::quick_prompts::QuickPrompt; use client_core::stores::settings::SettingsData; use client_core::stores::transcript::{SyncState, TranscriptState}; -use client_core::stores::ui::{CredentialsAck, ProviderProfileAck, UndoToast}; +use client_core::stores::ui::{CredentialsAck, ProviderProfileAck, UndoToast, WebSignIn}; use protocol::common::{AgentStyle, TerminalEndReason}; use protocol::events::TerminalInfo; use serde::Serialize; @@ -202,6 +202,9 @@ pub struct UiView { pub plan_approval_choices: BTreeMap, pub credentials_status: BTreeMap, pub provider_profile_status: BTreeMap, + /// machine pubkey → the code the phone sent to sign a browser in to that + /// machine's web page, and where the round trip stands. + pub web_sign_in: BTreeMap, pub undo_toast: Option, /// The terminals, low-frequency state only: the frames themselves go to /// the host on `CoreEvent::TerminalOutput`, never through a view. @@ -292,6 +295,7 @@ impl UiView { plan_approval_choices: ui.plan_approval_choices.clone(), credentials_status: ui.credentials_status.clone(), provider_profile_status: ui.provider_profile_status.clone(), + web_sign_in: ui.web_sign_in.clone(), undo_toast: ui.undo_toast.clone(), terminals: TerminalsView::from_stores(s), } @@ -558,11 +562,17 @@ mod tests { s.ui.select_machine(Some("m1")); s.ui.mark_session_unread("m1", "s1"); s.ui.set_plan_approval_choice("card1", "2"); + s.ui.note_web_sign_in_sent("m1", "K7QM-4XPA"); let uv = UiView::from_stores(&s); assert_eq!(uv.selected_machine.as_deref(), Some("m1")); assert!(uv.unread_sessions.contains(&client_core::notifications::session_key_of("m1", "s1"))); assert_eq!(uv.plan_approval_choices.get("card1").map(String::as_str), Some("2")); + assert_eq!(uv.web_sign_in["m1"].code, "K7QM-4XPA"); + assert_eq!( + uv.web_sign_in["m1"].state, + client_core::stores::ui::WebSignInState::Sending + ); let json = serde_json::to_string(&uv).unwrap(); assert!(json.contains(r#""selectedMachine":"m1""#)); } From 8779ccd581f06ea018399bde295295eb6e019a90 Mon Sep 17 00:00:00 2001 From: deymosh <232244450+deymosh@users.noreply.github.com> Date: Fri, 16 Oct 2026 17:18:30 +0200 Subject: [PATCH 06/30] fix(bridge): a web sign-in's answer echoes the code as the phone sent it MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The engine reads a typed code in any case, with or without its dash, but answered with the page's spelling, and the phone matches an answer to the code it sent — so a code typed in lower case signed the browser in while the phone kept waiting. The answer now carries the phone's own spelling. Engine tests cover the single use, the any-case match, and an unknown or lapsed code. Co-Authored-By: Claude Code --- crates/bridge-core/src/engine/web.rs | 10 +++-- crates/bridge-core/tests/web_sign_in.rs | 59 +++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 4 deletions(-) create mode 100644 crates/bridge-core/tests/web_sign_in.rs diff --git a/crates/bridge-core/src/engine/web.rs b/crates/bridge-core/src/engine/web.rs index 4687f758..c4b6a7e8 100644 --- a/crates/bridge-core/src/engine/web.rs +++ b/crates/bridge-core/src/engine/web.rs @@ -48,9 +48,11 @@ impl Engine { codes.insert(normalize(&code), expires_ms); } - /// A paired phone sent `code`: sign in the browser showing it, once. - pub(super) fn on_web_sign_in(&mut self, code: &str, phone: &str) { - let code = normalize(code); + /// A paired phone sent `code`: sign in the browser showing it, once. The + /// answer echoes the code exactly as the phone sent it, so the phone can + /// match it to the attempt it is showing however the user typed it. + pub(super) fn on_web_sign_in(&mut self, sent: &str, phone: &str) { + let code = normalize(sent); let now = self.now(); let live = self.web_sign_ins.codes.remove(&code).is_some_and(|expires| expires > now); if live { @@ -60,7 +62,7 @@ impl Engine { } else { log::info!("[Engine] A web sign-in code did not match"); } - self.publish_to(phone, BridgeToPhone::WebSignInResult(WebSignInResultMsg { code, signed_in: live })); + self.publish_to(phone, BridgeToPhone::WebSignInResult(WebSignInResultMsg { code: sent.to_string(), signed_in: live })); } } diff --git a/crates/bridge-core/tests/web_sign_in.rs b/crates/bridge-core/tests/web_sign_in.rs new file mode 100644 index 00000000..2e49a88e --- /dev/null +++ b/crates/bridge-core/tests/web_sign_in.rs @@ -0,0 +1,59 @@ +//! Signing a browser in to the bridge's web page, through the engine: the +//! page's code is let in once, only by a paired phone, only before it lapses. + +mod support; + +use bridge_core::{Effect, Input}; +use protocol::events::BridgeToPhone; +use serde_json::json; +use support::*; + +/// The page shows `code` for five minutes. +fn show(rig: &mut Rig, code: &str) { + let expires_ms = rig.system_now() + 5 * 60 * 1000; + rig.input(Input::WebSignInPending { code: code.into(), expires_ms }); + rig.take(); +} + +/// What the engine did with one `web-sign-in`: the browser it let in (by +/// its code), and the answer the phone got (code as echoed, signed in). +fn sign_in(rig: &mut Rig, sent: &str) -> (Option, Option<(String, bool)>) { + rig.send(json!({"v":12,"type":"web-sign-in","code":sent})); + let effects = rig.take(); + let let_in = effects.iter().find_map(|e| match e { + Effect::WebSignedIn { code, .. } => Some(code.clone()), + _ => None, + }); + let answer = effects.iter().find_map(|e| match e { + Effect::Publish { message: BridgeToPhone::WebSignInResult(r), .. } => Some((r.code.clone(), r.signed_in)), + _ => None, + }); + (let_in, answer) +} + +#[test] +fn a_code_the_page_shows_signs_its_browser_in_once() { + let mut rig = Rig::new(); + show(&mut rig, "K7QM-4XPA"); + assert_eq!(sign_in(&mut rig, "K7QM-4XPA"), (Some("K7QM-4XPA".into()), Some(("K7QM-4XPA".into(), true)))); + assert_eq!(sign_in(&mut rig, "K7QM-4XPA"), (None, Some(("K7QM-4XPA".into(), false))), "used up"); +} + +#[test] +fn a_typed_code_matches_in_any_case_and_its_answer_echoes_what_was_typed() { + let mut rig = Rig::new(); + show(&mut rig, "K7QM-4XPA"); + // The phone matches the answer to the code it sent, so the echo is the + // phone's own spelling, not the page's. + assert_eq!(sign_in(&mut rig, "k7qm4xpa"), (Some("K7QM-4XPA".into()), Some(("k7qm4xpa".into(), true)))); +} + +#[test] +fn a_lapsed_or_unknown_code_signs_nothing_in() { + let mut rig = Rig::new(); + show(&mut rig, "K7QM-4XPA"); + assert_eq!(sign_in(&mut rig, "AAAA-BBBB"), (None, Some(("AAAA-BBBB".into(), false)))); + rig.advance(5 * 60 * 1000 + 1); + rig.take(); + assert_eq!(sign_in(&mut rig, "K7QM-4XPA"), (None, Some(("K7QM-4XPA".into(), false))), "lapsed"); +} From eaa53c6face719f08fed9b6fe5f96231c39ea8fa Mon Sep 17 00:00:00 2001 From: deymosh <232244450+deymosh@users.noreply.github.com> Date: Fri, 16 Oct 2026 20:43:18 +0200 Subject: [PATCH 07/30] feat(android): sign a browser in to a machine's web page from the phone A machine's page gets a "Web page" group: the https address of the page on each wss:// direct endpoint (onion and plain ws:// ones serve none), each copyable, and a "Sign in a browser" row. That page scans the QR the web page shows, through the pairing scanner (which now takes the line it prompts with), or takes the typed code, and sends it with WebSignIn; it shows "Signing in", then the bridge's answer, or that none came within 15 s. A scanned code is sent only when the QR names this machine: a code shown by one bridge handed to another would sign in the wrong page. There is no deep link for the QR on purpose, so a link opened elsewhere cannot sign a browser in without the user scanning it on this page. Closing the page clears the machine's sign-in in the core, so a late answer is not kept for a screen that is gone; the clear is dispatched on the core host's own scope, since the composition's scope is already cancelled in onDispose. The page is wired in the shell and in Settings, each going back to the machine's page. The full-page snapshots get a taller canvas: the machine's page outgrew the old one. Co-Authored-By: Claude Code --- .../main/java/com/codedeck/plus/ui/Shell.kt | 10 +- .../plus/ui/screens/MachineSettings.kt | 7 +- .../plus/ui/screens/MachineWebPage.kt | 286 ++++++++++++++++++ .../plus/ui/screens/PairingScanView.kt | 6 +- .../codedeck/plus/ui/screens/PairingScreen.kt | 1 + .../plus/ui/screens/SettingsScreen.kt | 11 +- .../codedeck/plus/ui/DesignSnapshotTest.kt | 23 +- .../codedeck/plus/ui/screens/WebSignInTest.kt | 29 ++ ...DesignFullPageSnapshotTest_new_session.png | Bin 26090 -> 18548 bytes ....ui_DesignFullPageSnapshotTest_pairing.png | Bin 32989 -> 23613 bytes ....ui_DesignFullPageSnapshotTest_plugins.png | Bin 46209 -> 31697 bytes ...ui_DesignFullPageSnapshotTest_settings.png | Bin 34908 -> 24539 bytes ...FullPageSnapshotTest_settings_messages.png | Bin 20170 -> 14369 bytes ...plus.ui_DesignSnapshotTest_web_sign_in.png | Bin 0 -> 34954 bytes ...gnSnapshotTest_web_sign_in_not_matched.png | Bin 0 -> 47995 bytes ...DesignSnapshotTest_web_sign_in_sending.png | Bin 0 -> 33669 bytes ...signSnapshotTest_web_sign_in_signed_in.png | Bin 0 -> 33284 bytes 17 files changed, 364 insertions(+), 9 deletions(-) create mode 100644 apps/android/app/src/main/java/com/codedeck/plus/ui/screens/MachineWebPage.kt create mode 100644 apps/android/app/src/test/java/com/codedeck/plus/ui/screens/WebSignInTest.kt create mode 100644 apps/android/app/src/test/snapshots/images/com.codedeck.plus.ui_DesignSnapshotTest_web_sign_in.png create mode 100644 apps/android/app/src/test/snapshots/images/com.codedeck.plus.ui_DesignSnapshotTest_web_sign_in_not_matched.png create mode 100644 apps/android/app/src/test/snapshots/images/com.codedeck.plus.ui_DesignSnapshotTest_web_sign_in_sending.png create mode 100644 apps/android/app/src/test/snapshots/images/com.codedeck.plus.ui_DesignSnapshotTest_web_sign_in_signed_in.png diff --git a/apps/android/app/src/main/java/com/codedeck/plus/ui/Shell.kt b/apps/android/app/src/main/java/com/codedeck/plus/ui/Shell.kt index 78c00a27..3c4cf00c 100644 --- a/apps/android/app/src/main/java/com/codedeck/plus/ui/Shell.kt +++ b/apps/android/app/src/main/java/com/codedeck/plus/ui/Shell.kt @@ -25,6 +25,7 @@ import com.codedeck.plus.ui.screens.SessionsScreen import com.codedeck.plus.platform.Login import com.codedeck.plus.ui.screens.LogsScreen import com.codedeck.plus.ui.screens.MachineSettingsScreen +import com.codedeck.plus.ui.screens.WebSignInScreen import com.codedeck.plus.ui.screens.PairingScreen import com.codedeck.plus.ui.screens.McpScreen import com.codedeck.plus.ui.screens.AgentSettingsScreen @@ -51,6 +52,8 @@ private sealed interface Screen { data object Pairing : Screen /** A machine's settings page, opened from its name on the sessions list. */ data class Machine(val machine: String) : Screen + /** Signing a browser in to a machine's web page, opened from the machine's page. */ + data class WebSignIn(val machine: String) : Screen /** One agent's page on a machine, opened from the machine's page. */ data class Agent(val machine: String, val agent: String) : Screen /** One agent's plugins on a machine, opened from the agent's page. */ @@ -75,6 +78,7 @@ private fun Screen.parts(): List = when (this) { Screen.Logs -> listOf("logs") Screen.Pairing -> listOf("pairing") is Screen.Machine -> listOf("machine", machine) + is Screen.WebSignIn -> listOf("web-sign-in", machine) is Screen.Agent -> listOf("agent", machine, agent) is Screen.Plugins -> listOf("plugins", machine, agent) is Screen.Mcp -> listOf("mcp", machine, agent) @@ -89,7 +93,7 @@ private fun Screen.stateKey(): String = parts().joinToString("/") * shallower one. */ private fun Screen.depth(): Int = when (this) { Screen.Sessions -> 0 - Screen.Logs, is Screen.Agent, is Screen.Terminal -> 2 + Screen.Logs, is Screen.Agent, is Screen.Terminal, is Screen.WebSignIn -> 2 is Screen.Plugins, is Screen.Mcp, is Screen.PermissionRules, is Screen.Providers -> 3 else -> 1 } @@ -106,6 +110,7 @@ private val ScreenSaver = listSaver( "logs" -> Screen.Logs "pairing" -> Screen.Pairing "machine" -> Screen.Machine(saved[1]) + "web-sign-in" -> Screen.WebSignIn(saved[1]) "agent" -> Screen.Agent(saved[1], saved[2]) "plugins" -> Screen.Plugins(saved[1], saved[2]) "mcp" -> Screen.Mcp(saved[1], saved[2]) @@ -272,6 +277,7 @@ fun Shell( when (val current = screen) { Screen.Logs -> Screen.Settings is Screen.Agent -> Screen.Machine(current.machine) + is Screen.WebSignIn -> Screen.Machine(current.machine) is Screen.Plugins -> Screen.Agent(current.machine, current.agent) is Screen.Mcp -> Screen.Agent(current.machine, current.agent) is Screen.PermissionRules -> Screen.Agent(current.machine, current.agent) @@ -298,6 +304,7 @@ fun Shell( onBack = { go(Screen.Sessions) }, onOpenAgent = { agent -> go(Screen.Agent(current.machine, agent)) }, onOpenTerminal = { term -> go(Screen.Terminal(current.machine, term, session = null)) }, + onOpenWebSignIn = { go(Screen.WebSignIn(current.machine)) }, ) is Screen.Terminal -> TerminalScreen( core, @@ -306,6 +313,7 @@ fun Shell( current.session, onBack = { leaveTerminal(current) }, ) + is Screen.WebSignIn -> WebSignInScreen(core, current.machine, onBack = { go(Screen.Machine(current.machine)) }) is Screen.Agent -> AgentSettingsScreen( core, current.machine, diff --git a/apps/android/app/src/main/java/com/codedeck/plus/ui/screens/MachineSettings.kt b/apps/android/app/src/main/java/com/codedeck/plus/ui/screens/MachineSettings.kt index 4f64e7d9..43bda6c2 100644 --- a/apps/android/app/src/main/java/com/codedeck/plus/ui/screens/MachineSettings.kt +++ b/apps/android/app/src/main/java/com/codedeck/plus/ui/screens/MachineSettings.kt @@ -119,7 +119,8 @@ internal fun shortKey(key: String): String = if (key.length <= 20) key else "${k * plugins, MCP servers, saved permissions) or installs one it lacks — its * terminals ([onOpenTerminal]: a new one, or one of [terminals]), then * what is the machine's own: the relays it is reached over, its direct link, - * the bridge's credentials, and forgetting it. Pure — the caller supplies + * its web page and signing a browser in to it ([onOpenWebSignIn]), the + * bridge's credentials, and forgetting it. Pure — the caller supplies * the machine and a dispatcher — so it renders the same in a snapshot. */ @Composable @@ -133,6 +134,7 @@ fun MachineSettingsContent( onOpenAgent: (agent: String) -> Unit, terminals: List, onOpenTerminal: (term: String?) -> Unit, + onOpenWebSignIn: () -> Unit, ) { var confirmRemove by remember(machine.pubkeyHex) { mutableStateOf(false) } @@ -148,6 +150,7 @@ fun MachineSettingsContent( ) { GroupBody { MachineDirectLink(machine, dispatch) } } + MachineWebPageGroup(machine, onOpenWebSignIn) if (machine.credentials.isNotEmpty()) { Group(title = "Credentials") { GroupBody { MachineCredentials(machine, credentialsStatus, dispatch, scope = CredentialScope.Bridge) } @@ -329,6 +332,7 @@ fun MachineSettingsScreen( onBack: () -> Unit, onOpenAgent: (agent: String) -> Unit, onOpenTerminal: (term: String?) -> Unit, + onOpenWebSignIn: () -> Unit, ) { val connection by core.connection.collectAsState() val ui by core.ui.collectAsState() @@ -344,5 +348,6 @@ fun MachineSettingsScreen( onOpenAgent = onOpenAgent, terminals = ui?.terminals?.byMachine?.get(pubkey).orEmpty(), onOpenTerminal = onOpenTerminal, + onOpenWebSignIn = onOpenWebSignIn, ) } diff --git a/apps/android/app/src/main/java/com/codedeck/plus/ui/screens/MachineWebPage.kt b/apps/android/app/src/main/java/com/codedeck/plus/ui/screens/MachineWebPage.kt new file mode 100644 index 00000000..dce581f0 --- /dev/null +++ b/apps/android/app/src/main/java/com/codedeck/plus/ui/screens/MachineWebPage.kt @@ -0,0 +1,286 @@ +package com.codedeck.plus.ui.screens + +import android.Manifest +import android.content.ClipData +import android.content.pm.PackageManager +import androidx.activity.compose.rememberLauncherForActivityResult +import androidx.activity.result.contract.ActivityResultContracts +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.outlined.Check +import androidx.compose.material.icons.outlined.ContentCopy +import androidx.compose.material.icons.outlined.QrCodeScanner +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.ClipEntry +import androidx.compose.ui.platform.LocalClipboard +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.text.input.ImeAction +import androidx.compose.ui.text.input.KeyboardCapitalization +import androidx.compose.ui.text.style.TextOverflow +import androidx.core.content.ContextCompat +import com.codedeck.plus.core.CoreHost +import com.codedeck.plus.ui.components.EmptyState +import com.codedeck.plus.ui.components.ErrorNote +import com.codedeck.plus.ui.components.Field +import com.codedeck.plus.ui.components.Group +import com.codedeck.plus.ui.components.GroupBody +import com.codedeck.plus.ui.components.IconAction +import com.codedeck.plus.ui.components.NavRow +import com.codedeck.plus.ui.components.Page +import com.codedeck.plus.ui.components.PrimaryButton +import com.codedeck.plus.ui.components.RowSpinner +import com.codedeck.plus.ui.components.SecondaryButton +import com.codedeck.plus.ui.theme.Tokens +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch +import uniffi.client_ffi.UniffiIntent +import uniffi.client_ffi.UniffiMachineSummary +import uniffi.client_ffi.UniffiWebSignIn +import uniffi.client_ffi.UniffiWebSignInState + +/** How long a sent code waits for the bridge's answer before the page says none came. */ +private const val ANSWER_WAIT_MS = 15_000L + +/** + * The address of the bridge's web page for each of its `wss://` direct + * endpoints: the page is served on the direct link's own port, at its root. + * An onion endpoint serves no page, and a plain `ws://` one has no TLS to + * serve it over. + */ +internal fun webPageUrls(machine: UniffiMachineSummary): List = + (machine.directAdvertised + machine.directEndpoints) + .filter { it.startsWith("wss://", ignoreCase = true) } + .map { it.substring("wss://".length).substringBefore('/').substringBefore('?') } + .filter { it.isNotEmpty() && !it.substringBeforeLast(':').endsWith(".onion", ignoreCase = true) } + .map { "https://$it/" } + .distinct() + +/** What a scanned QR asks of this page. */ +internal sealed interface ScannedSignIn { + data class Code(val code: String) : ScannedSignIn + + /** A web page's sign-in QR, but for another machine's page. */ + data object OtherMachine : ScannedSignIn + + data object NotSignIn : ScannedSignIn +} + +/** + * Reads `codedeck://web-sign-in?machine=&code=`, the QR a web + * page shows. A code is only sent to the machine the QR names: a browser on + * another machine's page would otherwise be signed in to the wrong one, or a + * code shown by one bridge be handed to another. + */ +internal fun readSignInQr(text: String, machineNpub: String): ScannedSignIn { + val query = text.trim().removePrefix("codedeck://web-sign-in?").takeIf { it != text.trim() } ?: return ScannedSignIn.NotSignIn + val params = query.split('&').mapNotNull { part -> part.split('=', limit = 2).takeIf { it.size == 2 }?.let { it[0] to it[1] } }.toMap() + val code = params["code"]?.takeIf { it.isNotBlank() } ?: return ScannedSignIn.NotSignIn + return if (params["machine"] == machineNpub) ScannedSignIn.Code(code) else ScannedSignIn.OtherMachine +} + +/** + * The "Web page" group on a machine's page: the addresses its web page is + * served on (each copies, in full with its https://), and the row that opens + * [WebSignInContent]. + */ +@Composable +internal fun MachineWebPageGroup(machine: UniffiMachineSummary, onOpenWebSignIn: () -> Unit) { + val urls = webPageUrls(machine) + val clipboard = LocalClipboard.current + val scope = rememberCoroutineScope() + Group( + title = "Web page", + footer = if (urls.isEmpty()) { + "The bridge serves a dashboard on its direct link's wss:// address. Open it in a browser, then sign it in from here." + } else { + "The bridge's dashboard, for a browser that reaches the direct link. Sign it in from here." + }, + ) { + urls.forEach { url -> + Row( + Modifier.fillMaxWidth().padding(start = Tokens.Space4, end = Tokens.Space1, top = Tokens.Space1, bottom = Tokens.Space1), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(Tokens.Space3), + ) { + Text( + url.removePrefix("https://").removeSuffix("/"), + color = Tokens.Text, + fontSize = Tokens.TextSm, + fontFamily = Tokens.FontMono, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + modifier = Modifier.weight(1f), + ) + IconAction( + Icons.Outlined.ContentCopy, + "Copy $url", + onClick = { scope.launch { clipboard.setClipEntry(ClipEntry(ClipData.newPlainText("address", url))) } }, + tint = Tokens.TextMuted, + ) + } + Divider() + } + NavRow("Sign in a browser", onClick = onOpenWebSignIn) + } +} + +/** + * Signing a browser in to the machine's web page: scan the QR the page shows, + * or type its code. The phone sends the code to the bridge over its usual + * signed path, and the bridge signs in the browser showing it. Pure — the + * caller holds the draft and the round trip — so it renders in a snapshot. + * + * [signIn] is the code this phone sent and the bridge's answer; [noAnswer] + * that the answer did not come in time; [notice] what was wrong with a scan. + */ +@Composable +fun WebSignInContent( + signIn: UniffiWebSignIn?, + noAnswer: Boolean, + notice: String?, + code: String, + onCodeChange: (String) -> Unit, + onSend: (String) -> Unit, + onScan: () -> Unit, + onBack: () -> Unit, +) { + Page(title = "Sign in a browser", onBack = onBack) { + if (signIn?.state == UniffiWebSignInState.SIGNED_IN) { + EmptyState( + icon = Icons.Outlined.Check, + title = "Browser signed in", + body = "It opens the dashboard now, and stays signed in for 30 days or until it signs out.", + action = "Done", + onAction = onBack, + modifier = Modifier.fillMaxWidth().padding(top = Tokens.Space7), + ) + return@Page + } + val sending = signIn?.state == UniffiWebSignInState.SENDING && !noAnswer + val error = when { + notice != null -> notice + noAnswer -> "No answer from the bridge. Check that it is online, then try again." + signIn?.state == UniffiWebSignInState.NOT_MATCHED -> "That code did not match. It works once and for 5 minutes: reload the page for a new one." + else -> null + } + error?.let { ErrorNote(it) } + + Group(footer = "Open the machine's web page in a browser. It shows a QR and a code.") { + GroupBody { + PrimaryButton("Scan the browser's QR", onClick = onScan, icon = Icons.Outlined.QrCodeScanner, enabled = !sending, modifier = Modifier.fillMaxWidth()) + } + } + Group(title = "Or type the code") { + GroupBody { + Field( + value = code, + onValueChange = onCodeChange, + placeholder = "ABCD-EFGH", + mono = true, + keyboardOptions = KeyboardOptions(capitalization = KeyboardCapitalization.Characters, autoCorrectEnabled = false, imeAction = ImeAction.Done), + ) + if (sending) { + Row(verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(Tokens.Space1)) { + RowSpinner() + Text("Signing in…", color = Tokens.TextMuted, fontSize = Tokens.TextMd) + } + } else { + SecondaryButton("Sign in", onClick = { onSend(code) }, enabled = code.isNotBlank()) + } + } + } + } +} + +/** + * [WebSignInContent] for the machine [pubkey], from the core. Closing it + * drops this machine's sign-in from the core, so an answer that arrives later + * is not kept for a screen that is gone. + */ +@Composable +fun WebSignInScreen(core: CoreHost, pubkey: String, onBack: () -> Unit) { + val ui by core.ui.collectAsState() + val scope = rememberCoroutineScope() + val context = LocalContext.current + val machine = machineOrLeave(core, pubkey, onGone = onBack) ?: return + val signIn = ui?.webSignIn?.get(pubkey) + var code by rememberSaveable { mutableStateOf("") } + var notice by remember { mutableStateOf(null) } + var noAnswer by remember { mutableStateOf(false) } + var scanOpen by remember { mutableStateOf(false) } + + fun send(sent: String) { + notice = null + noAnswer = false + scope.launch { core.dispatch(UniffiIntent.WebSignIn(pubkey, sent)) } + } + + DisposableEffect(pubkey) { + onDispose { core.dispatchDetached(UniffiIntent.ClearWebSignIn(pubkey)) } + } + LaunchedEffect(signIn?.code, signIn?.state) { + if (signIn?.state == UniffiWebSignInState.SENDING) { + delay(ANSWER_WAIT_MS) + noAnswer = true + } + } + + val cameraPermission = rememberLauncherForActivityResult(ActivityResultContracts.RequestPermission()) { granted -> + // Denied leaves the typed path; the next tap asks again. + if (granted) scanOpen = true + } + + Box(Modifier.fillMaxSize()) { + WebSignInContent( + signIn = signIn, + noAnswer = noAnswer, + notice = notice, + code = code, + onCodeChange = { code = it }, + onSend = ::send, + onScan = { + if (ContextCompat.checkSelfPermission(context, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) { + scanOpen = true + } else { + cameraPermission.launch(Manifest.permission.CAMERA) + } + }, + onBack = onBack, + ) + if (scanOpen) { + PairingScanView( + prompt = "Point the camera at the QR on the web page", + onDecoded = { text -> + scanOpen = false + when (val scanned = readSignInQr(text, machine.npub)) { + is ScannedSignIn.Code -> { + code = scanned.code + send(scanned.code) + } + ScannedSignIn.OtherMachine -> notice = "That QR is another machine's web page, not this one's." + ScannedSignIn.NotSignIn -> notice = "That is not a web page's sign-in QR." + } + }, + onDismiss = { scanOpen = false }, + ) + } + } +} diff --git a/apps/android/app/src/main/java/com/codedeck/plus/ui/screens/PairingScanView.kt b/apps/android/app/src/main/java/com/codedeck/plus/ui/screens/PairingScanView.kt index e21174b8..d544f533 100644 --- a/apps/android/app/src/main/java/com/codedeck/plus/ui/screens/PairingScanView.kt +++ b/apps/android/app/src/main/java/com/codedeck/plus/ui/screens/PairingScanView.kt @@ -53,7 +53,8 @@ import kotlin.coroutines.resume import kotlinx.coroutines.suspendCancellableCoroutine /** - * Full-screen in-app QR camera scan for the pairing screen — port of + * Full-screen in-app QR camera scan, with [prompt] saying what to point it + * at (the bridge's pairing QR, a web page's sign-in QR) — port of * `apps/mobile/src/platform/qrScan.ts`'s contract: back camera, QR format * only, and "no scan" on every exit path. Cancel (close button or system * back), a denied CAMERA prompt, missing camera hardware, or a failed @@ -82,6 +83,7 @@ import kotlinx.coroutines.suspendCancellableCoroutine */ @Composable fun PairingScanView( + prompt: String, onDecoded: (String) -> Unit, onDismiss: () -> Unit, ) { @@ -171,7 +173,7 @@ fun PairingScanView( .border(2.dp, Tokens.Text, RoundedCornerShape(Tokens.RadiusMd)), ) Text( - "Point the camera at the bridge's pairing QR", + prompt, color = Tokens.TextMuted, fontSize = Tokens.TextSm, modifier = Modifier.padding(top = Tokens.Space3), diff --git a/apps/android/app/src/main/java/com/codedeck/plus/ui/screens/PairingScreen.kt b/apps/android/app/src/main/java/com/codedeck/plus/ui/screens/PairingScreen.kt index 8257746b..8ecfd38a 100644 --- a/apps/android/app/src/main/java/com/codedeck/plus/ui/screens/PairingScreen.kt +++ b/apps/android/app/src/main/java/com/codedeck/plus/ui/screens/PairingScreen.kt @@ -167,6 +167,7 @@ internal fun PairingBody( // runs exactly once per granted+open window. if (scanOpen) { PairingScanView( + prompt = "Point the camera at the bridge's pairing QR", onDecoded = { decoded -> // One path, same as a paste: the raw string fills the // visible field AND crosses into BeginPairing diff --git a/apps/android/app/src/main/java/com/codedeck/plus/ui/screens/SettingsScreen.kt b/apps/android/app/src/main/java/com/codedeck/plus/ui/screens/SettingsScreen.kt index b94c23de..99508217 100644 --- a/apps/android/app/src/main/java/com/codedeck/plus/ui/screens/SettingsScreen.kt +++ b/apps/android/app/src/main/java/com/codedeck/plus/ui/screens/SettingsScreen.kt @@ -87,6 +87,8 @@ private const val UI_SCALE_DEFAULT = 1f internal sealed interface SettingsPage { data object Hub : SettingsPage data class Machine(val pubkey: String) : SettingsPage + /** Signing a browser in to a machine's web page, opened from the machine's page. */ + data class WebSignIn(val pubkey: String) : SettingsPage /** One agent's page on a machine, opened from the machine's page. */ data class Agent(val pubkey: String, val agent: String) : SettingsPage /** One agent's plugins on a machine, opened from the agent's page. */ @@ -110,6 +112,7 @@ internal sealed interface SettingsPage { fun save(): String = when (this) { Hub -> "hub" is Machine -> "machine:$pubkey" + is WebSignIn -> "web-sign-in:$pubkey" is Agent -> "agent:$pubkey:$agent" is Plugins -> "plugins:$pubkey:$agent" is Mcp -> "mcp:$pubkey:$agent" @@ -129,7 +132,7 @@ internal sealed interface SettingsPage { val depth: Int get() = when (this) { Hub -> 0 - is Agent, is Terminal -> 2 + is Agent, is Terminal, is WebSignIn -> 2 is Plugins, is Mcp, is PermissionRules, is Providers -> 3 else -> 1 } @@ -137,6 +140,7 @@ internal sealed interface SettingsPage { companion object { fun restore(saved: String): SettingsPage = when { saved.startsWith("machine:") -> Machine(saved.removePrefix("machine:")) + saved.startsWith("web-sign-in:") -> WebSignIn(saved.removePrefix("web-sign-in:")) saved.startsWith("agent:") -> saved.split(':').let { Agent(it[1], it.drop(2).joinToString(":")) } saved.startsWith("plugins:") -> saved.split(':').let { Plugins(it[1], it.drop(2).joinToString(":")) } saved.startsWith("mcp:") -> saved.split(':').let { Mcp(it[1], it.drop(2).joinToString(":")) } @@ -200,12 +204,13 @@ fun SettingsScreen( pageKey = next.save() } val toHub = { open(SettingsPage.Hub) } - // An agent's page goes back to its machine's, and a page of the agent's + // An agent's page and a web sign-in go back to their machine's, and a page of the agent's // (its providers, plugins, MCP servers, permissions) to the agent's, // where each was left; every other page to the hub. val parent: SettingsPage? = when (page) { is SettingsPage.Agent -> SettingsPage.Machine(page.pubkey) is SettingsPage.Terminal -> SettingsPage.Machine(page.pubkey) + is SettingsPage.WebSignIn -> SettingsPage.Machine(page.pubkey) is SettingsPage.Plugins -> SettingsPage.Agent(page.pubkey, page.agent) is SettingsPage.Mcp -> SettingsPage.Agent(page.pubkey, page.agent) is SettingsPage.PermissionRules -> SettingsPage.Agent(page.pubkey, page.agent) @@ -257,10 +262,12 @@ fun SettingsScreen( onOpenAgent = { agent -> open(SettingsPage.Agent(machine.pubkeyHex, agent)) }, terminals = ui?.terminals?.byMachine?.get(machine.pubkeyHex).orEmpty(), onOpenTerminal = { term -> open(SettingsPage.Terminal(machine.pubkeyHex, term)) }, + onOpenWebSignIn = { open(SettingsPage.WebSignIn(machine.pubkeyHex)) }, ) } } is SettingsPage.Terminal -> TerminalScreen(core, page.pubkey, page.term, session = null, onBack = back) + is SettingsPage.WebSignIn -> WebSignInScreen(core, page.pubkey, onBack = back) is SettingsPage.Agent -> AgentSettingsScreen( core, page.pubkey, diff --git a/apps/android/app/src/test/java/com/codedeck/plus/ui/DesignSnapshotTest.kt b/apps/android/app/src/test/java/com/codedeck/plus/ui/DesignSnapshotTest.kt index a6848f02..2d0d16cf 100644 --- a/apps/android/app/src/test/java/com/codedeck/plus/ui/DesignSnapshotTest.kt +++ b/apps/android/app/src/test/java/com/codedeck/plus/ui/DesignSnapshotTest.kt @@ -26,6 +26,7 @@ import com.codedeck.plus.ui.screens.ExtraKeysRow import com.codedeck.plus.ui.screens.TerminalLockedContent import com.codedeck.plus.ui.components.Page import androidx.compose.material3.Text +import com.codedeck.plus.ui.screens.WebSignInContent import com.codedeck.plus.ui.screens.McpContent import com.codedeck.plus.ui.screens.PermissionRulesContent import com.codedeck.plus.ui.screens.ConnectionPage @@ -50,6 +51,8 @@ import uniffi.client_ffi.UniffiAttachedTerminal import uniffi.client_ffi.UniffiTerminalEnded import uniffi.client_ffi.UniffiTerminalInfo import uniffi.client_ffi.UniffiTerminalRefusal +import uniffi.client_ffi.UniffiWebSignIn +import uniffi.client_ffi.UniffiWebSignInState import uniffi.client_ffi.UniffiUsageData import uniffi.client_ffi.UniffiBackupStatus import uniffi.client_ffi.UniffiBackupView @@ -295,14 +298,14 @@ private val pages: Map Unit> = linkedMapOf( MachineSettingsContent( machine = workstation.copy(capabilities = listOf(TERMINAL_CAPABILITY)), connectedRelays = setOf("wss://relay.example.org"), credentialsStatus = null, now = NOW, dispatch = {}, onBack = {}, onOpenAgent = {}, - terminals = listOf(bashTerminal), onOpenTerminal = {}, + terminals = listOf(bashTerminal), onOpenTerminal = {}, onOpenWebSignIn = {}, ) }, "settings_machine_update_needed" to { MachineSettingsContent( machine = workstation.copy(updateNeeded = "bridge"), connectedRelays = setOf("wss://relay.example.org"), credentialsStatus = null, now = NOW, dispatch = {}, onBack = {}, onOpenAgent = {}, - terminals = emptyList(), onOpenTerminal = {}, + terminals = emptyList(), onOpenTerminal = {}, onOpenWebSignIn = {}, ) }, "terminal_opening" to { Terminal(attached(term = null)) }, @@ -329,6 +332,10 @@ private val pages: Map Unit> = linkedMapOf( MachineTerminalsGroup(workstation, emptyList(), NOW, onOpen = {}, onAttach = {}) } }, + "web_sign_in" to { WebSignIn(signIn = null, code = "") }, + "web_sign_in_sending" to { WebSignIn(UniffiWebSignIn("K7QM-4XTR", UniffiWebSignInState.SENDING), code = "K7QM-4XTR") }, + "web_sign_in_not_matched" to { WebSignIn(UniffiWebSignIn("K7QM-4XTR", UniffiWebSignInState.NOT_MATCHED), code = "K7QM-4XTR") }, + "web_sign_in_signed_in" to { WebSignIn(UniffiWebSignIn("K7QM-4XTR", UniffiWebSignInState.SIGNED_IN), code = "K7QM-4XTR") }, "settings_agent_opencode" to { AgentPage("opencode") }, "settings_agent_claude" to { AgentPage("claude-code") }, "settings_agent_not_installed" to { AgentPage("deepseek-harness") }, @@ -470,6 +477,12 @@ private fun AgentPage(agent: String) = AgentSettingsContent( onOpenProviders = {}, onOpenPlugins = {}, onOpenMcp = {}, onOpenPermissionRules = {}, ) +/** Signing a browser in to the workstation's web page. */ +@Composable +private fun WebSignIn(signIn: UniffiWebSignIn?, code: String) = WebSignInContent( + signIn = signIn, noAnswer = false, notice = null, code = code, onCodeChange = {}, onSend = {}, onScan = {}, onBack = {}, +) + @Composable private fun Styled(look: AgentLook, content: @Composable () -> Unit) = CompositionLocalProvider(LocalAgentLook provides look, content = content) @@ -540,6 +553,10 @@ class DesignSnapshotTest { @Test fun terminal_locked_unavailable() = paparazzi.page("terminal_locked_unavailable") @Test fun session_options_terminal() = paparazzi.page("session_options_terminal") @Test fun machine_terminals() = paparazzi.page("machine_terminals") + @Test fun web_sign_in() = paparazzi.page("web_sign_in") + @Test fun web_sign_in_sending() = paparazzi.page("web_sign_in_sending") + @Test fun web_sign_in_not_matched() = paparazzi.page("web_sign_in_not_matched") + @Test fun web_sign_in_signed_in() = paparazzi.page("web_sign_in_signed_in") @Test fun settings_agent_opencode() = paparazzi.page("settings_agent_opencode") @Test fun settings_agent_claude() = paparazzi.page("settings_agent_claude") @Test fun settings_agent_not_installed() = paparazzi.page("settings_agent_not_installed") @@ -580,7 +597,7 @@ class DesignSnapshotTest { class DesignFullPageSnapshotTest { @get:Rule val paparazzi = Paparazzi( - deviceConfig = DeviceConfig.PIXEL_6.copy(softButtons = false, screenWidth = 1080, screenHeight = 4200, density = Density.XXHIGH), + deviceConfig = DeviceConfig.PIXEL_6.copy(softButtons = false, screenWidth = 1080, screenHeight = 5400, density = Density.XXHIGH), showSystemUi = false, ) diff --git a/apps/android/app/src/test/java/com/codedeck/plus/ui/screens/WebSignInTest.kt b/apps/android/app/src/test/java/com/codedeck/plus/ui/screens/WebSignInTest.kt new file mode 100644 index 00000000..5a37ace7 --- /dev/null +++ b/apps/android/app/src/test/java/com/codedeck/plus/ui/screens/WebSignInTest.kt @@ -0,0 +1,29 @@ +package com.codedeck.plus.ui.screens + +import com.codedeck.plus.ui.DesignFixtures +import org.junit.Assert.assertEquals +import org.junit.Test + +class WebSignInTest { + private val machine = DesignFixtures.workstation + + @Test + fun the_page_is_served_at_the_root_of_each_wss_endpoint() { + assertEquals(listOf("https://192.168.1.20:7447/", "https://workstation.tail1234.ts.net:7447/"), webPageUrls(machine)) + val more = machine.copy( + directAdvertised = listOf("wss://192.168.1.20:7447/", "ws://abcdef.onion:7447", "wss://abcdef.onion:7447"), + directEndpoints = listOf("wss://192.168.1.20:7447"), + ) + assertEquals(listOf("https://192.168.1.20:7447/"), webPageUrls(more)) + } + + @Test + fun a_scanned_code_is_sent_only_to_the_machine_its_qr_names() { + val npub = machine.npub + assertEquals(ScannedSignIn.Code("K7QM-4XTR"), readSignInQr(" codedeck://web-sign-in?machine=$npub&code=K7QM-4XTR\n", npub)) + assertEquals(ScannedSignIn.OtherMachine, readSignInQr("codedeck://web-sign-in?machine=npub1other&code=K7QM-4XTR", npub)) + assertEquals(ScannedSignIn.OtherMachine, readSignInQr("codedeck://web-sign-in?code=K7QM-4XTR", npub)) + assertEquals(ScannedSignIn.NotSignIn, readSignInQr("codedeck://pair?npub=$npub&token=x", npub)) + assertEquals(ScannedSignIn.NotSignIn, readSignInQr("codedeck://web-sign-in?machine=$npub&code=", npub)) + } +} diff --git a/apps/android/app/src/test/snapshots/images/com.codedeck.plus.ui_DesignFullPageSnapshotTest_new_session.png b/apps/android/app/src/test/snapshots/images/com.codedeck.plus.ui_DesignFullPageSnapshotTest_new_session.png index f642d9b6b6fd5bf7c55b2834773dc39948f5406c..a5f7db3daefdc000084ecfb64ac2c931a8df4553 100644 GIT binary patch literal 18548 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

PO+udgG=J|3;MTkqLO0(##OoGl{(i3OA31QW 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 literal 26090 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⪙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�ZSKhtzD5uq3i7(~Mr$`Ax}bhj(i9fh>0bsfXS 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 AH2?qr literal 32989 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

v)%=0=YEs4IZY4@{(Yrk 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 literal 34908 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≶U4vgd;UGqvnaM=gzu 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 DC_9m4 diff --git a/apps/android/app/src/test/snapshots/images/com.codedeck.plus.ui_DesignFullPageSnapshotTest_settings_messages.png b/apps/android/app/src/test/snapshots/images/com.codedeck.plus.ui_DesignFullPageSnapshotTest_settings_messages.png index 8209742fb1518d9b371b9f58ebe96b9a22af8922..4f4b4848ab20e281129c5c441b72a3d7791e1933 100644 GIT binary patch literal 14369 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 RsI7l!%JLd=6|yg({|ohdl>-0( literal 20170 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Ⓢ6MNL0)_!&ZC!i%K*> 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 diff --git a/apps/android/app/src/test/snapshots/images/com.codedeck.plus.ui_DesignSnapshotTest_web_sign_in.png b/apps/android/app/src/test/snapshots/images/com.codedeck.plus.ui_DesignSnapshotTest_web_sign_in.png new file mode 100644 index 0000000000000000000000000000000000000000..1a9ff466f71c89371e658b06aee00becbba3f3e7 GIT binary patch literal 34954 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

8{J@mbeG^cf11&{|T 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 iy;+?99@$eZy~dg^4=9tXqzwtdV5 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 literal 0 HcmV?d00001 diff --git a/apps/android/app/src/test/snapshots/images/com.codedeck.plus.ui_DesignSnapshotTest_web_sign_in_sending.png b/apps/android/app/src/test/snapshots/images/com.codedeck.plus.ui_DesignSnapshotTest_web_sign_in_sending.png new file mode 100644 index 0000000000000000000000000000000000000000..aafae5e346d79920a6c30bdac60c3144098021c8 GIT binary patch literal 33669 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 Date: Fri, 16 Oct 2026 20:45:46 +0200 Subject: [PATCH 08/30] docs: the bridge's web page, its sign-in wire and the phone's page PROTOCOL.md gets the sign-in messages (the code's format, that it works once for 5 minutes, that the answer echoes the code as the phone sent it, and that a phone sends a scanned code only to the machine its QR names), with their traffic cost. BRIDGE.md says where the page is served, how a browser signs in and for how long, what it shows, and how it is hardened for a network that is not trusted. CLIENT.md describes the phone's "Web page" group and sign-in page. Co-Authored-By: Claude Code --- docs/BRIDGE.md | 24 ++++++++++++++++++++++++ docs/CLIENT.md | 15 +++++++++++++++ docs/PROTOCOL.md | 21 +++++++++++++++++++++ 3 files changed, 60 insertions(+) diff --git a/docs/BRIDGE.md b/docs/BRIDGE.md index 80656678..025cd806 100644 --- a/docs/BRIDGE.md +++ b/docs/BRIDGE.md @@ -221,6 +221,30 @@ the heartbeat): add the host's addresses to `direct.endpoints`, or on the phone, in the machine's settings. To turn the link off, remove `direct` from `config.json`. +### Web page + +With the direct link listening on `wss://`, the same port serves a web page +for a browser: open `https://

:7447/` (the bridge logs it at start, +`[Web] The bridge's web page: …`). The browser gets the same self-signed +certificate as the phone, so it shows a certificate warning; compare the +SHA-256 it shows with the one `[Direct] Listening on …` logs before +accepting it. Plain `http://` on the port redirects to +`https://`; the onion listener serves no page. + +A browser signs in with a paired phone: the page shows a code and a QR, and +on the phone the machine's page, "Sign in a browser", scans or types it. The +browser then stays signed in for 30 days (a cookie only the bridge can read, +sent only over HTTPS) or until it signs out. Until then it sees only the +sign-in page. The page shows what the heartbeat carries — the bridge, the +direct link, the agents and their credential status, the sessions — and never +a secret. + +Because a LAN or VPN is not a trusted place, the page refuses a `Host` that +is not an IP address, `localhost` or a host the direct endpoints name, +requires an `Origin` equal to its own on every `POST`, forbids framing, +caching and any script or connection not its own, rate-limits sign-in starts +to 10 a minute per address, and caps pending codes and signed-in browsers. + ## Terminal A phone can open a real terminal on the bridge: a shell in a pseudo-terminal diff --git a/docs/CLIENT.md b/docs/CLIENT.md index 4967bfff..f6b32dd6 100644 --- a/docs/CLIENT.md +++ b/docs/CLIENT.md @@ -408,6 +408,21 @@ link is an extra path beside the relays, never a replacement. - The machines view reports the endpoint each link is up on; Settings shows it per machine. +### Web page sign-in + +A machine's page has a "Web page" group: the `https://` address of the +bridge's web page on each of its `wss://` direct endpoints (onion and +plain `ws://` ones serve no page), and "Sign in a browser" +(`screens/MachineWebPage.kt`, the wire in +[`PROTOCOL.md`](PROTOCOL.md#web-page-sign-in)). That page scans the +browser's QR in the app's own scanner, or takes the typed code, and +dispatches `WebSignIn`; the UI view's `webSignIn` (by machine) says whether +the code is on its way, signed in, or did not match, and the page says so +when no answer came in 15 s. A QR naming another machine is refused before +anything is sent. The QR has no deep link on purpose: a link opened +elsewhere must not sign a browser in without the user on this page. Closing +the page dispatches `ClearWebSignIn`, so a late answer is dropped. + ## Conventions - A UniFFI error variant must not have a field named `message` (it collides diff --git a/docs/PROTOCOL.md b/docs/PROTOCOL.md index ab8b420e..eef9fd56 100644 --- a/docs/PROTOCOL.md +++ b/docs/PROTOCOL.md @@ -767,6 +767,27 @@ spec. each authored by the identity that said `HELLO`; the engine accepts only `terminal-input` on the live kind, so nothing else can ride it in. +### Web page sign-in + +The bridge serves a web page on its direct link's `wss://` port (the +bridge's side is in [`BRIDGE.md`](BRIDGE.md#web-page)). A browser signs in +with a paired phone, never a password: the page shows a code of 8 +characters (`ABCD-EFGH`, from an alphabet without look-alikes) and a QR of +`codedeck://web-sign-in?machine=&code=`. + +- `web-sign-in {code}` (phone → bridge, a signed command like any other). + The bridge reads the code in any case, with or without its dash, and + matches it against the codes its page is showing: each works once, for + 5 minutes. +- `web-sign-in-result {code, signedIn}` to the asking client. `code` is the + code exactly as the phone sent it, so the phone can tell which attempt + this answers; `signedIn` false means mistyped, expired or already used. +- A phone sends a scanned code only to the machine its QR names: a code + shown by one bridge must never sign in another's page. + +Cost: two small command-class events per sign-in, nothing while no one +signs in. + ### Version and capabilities Every message, both ways, carries `v`: its sender's protocol version (12), From 3cd48b2fa98066403a5c75fb7414b8a439f10221 Mon Sep 17 00:00:00 2001 From: deymosh <232244450+deymosh@users.noreply.github.com> Date: Fri, 16 Oct 2026 20:48:42 +0200 Subject: [PATCH 09/30] fix(android): the web sign-in says a bridge restart signs the browser out The bridge keeps signed-in browsers in memory only, so a restart ends every web session before its 30 days; the phone's confirmation and BRIDGE.md now say so rather than promise the whole 30 days. Co-Authored-By: Claude Code --- .../plus/ui/screens/MachineWebPage.kt | 2 +- ...signSnapshotTest_web_sign_in_signed_in.png | Bin 33284 -> 36437 bytes docs/BRIDGE.md | 3 ++- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/android/app/src/main/java/com/codedeck/plus/ui/screens/MachineWebPage.kt b/apps/android/app/src/main/java/com/codedeck/plus/ui/screens/MachineWebPage.kt index dce581f0..dffb32bb 100644 --- a/apps/android/app/src/main/java/com/codedeck/plus/ui/screens/MachineWebPage.kt +++ b/apps/android/app/src/main/java/com/codedeck/plus/ui/screens/MachineWebPage.kt @@ -167,7 +167,7 @@ fun WebSignInContent( EmptyState( icon = Icons.Outlined.Check, title = "Browser signed in", - body = "It opens the dashboard now, and stays signed in for 30 days or until it signs out.", + body = "It opens the dashboard now, and stays signed in for 30 days, until it signs out or the bridge restarts.", action = "Done", onAction = onBack, modifier = Modifier.fillMaxWidth().padding(top = Tokens.Space7), diff --git a/apps/android/app/src/test/snapshots/images/com.codedeck.plus.ui_DesignSnapshotTest_web_sign_in_signed_in.png b/apps/android/app/src/test/snapshots/images/com.codedeck.plus.ui_DesignSnapshotTest_web_sign_in_signed_in.png index cf632326cab1591223ec986c9987801dfedf69cd..44472584ca48bcf274da23e86135bf3af794f595 100644 GIT binary patch literal 36437 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 z⪼>7@r1mlFb5vR{q`Vo$eB2q18uVfGGju+MT z420EcPc+5gvrWcm$kWpGj~faI>DExMb*tjiDabo^OgAAEji@P=P{*r&p4PL$h+{At zZ4f0}8&PR=BO`=~B)G^p%;b|V8I%sZK+W{V^q-sHi6{m}e8Ukd<5v_;4jv%!F;^*Z z4{3u^nNqIj3+5shGZDjAV~H&jg)`7Q#-Y;WH2R12XXSbZSI$t zyMQ1yzJ>x@2DoQn_V>yf9@36^K1grbS72WK6w$w#pSgQ^Yq~Xyt~sbIVZcc_Esi; z^p-LUe+ULlCa%#_X>lQ@&~G`hC1=!NmiCD+OuqqBJHrR8Ge=OVo<9@V>+ATB$smqP zm-~mxfIY`0)wcGZGX_iKPoINc`uMIu=Xx*~@tbX8fQHjb9y$Zd7Zo!6AJ3QV^V3}& zpMksVSA6CeZ}qXy8b(LISCd3G3S;6tkvCVfHKqZ21rt6EBw!E zw@W6#_(W0bg3J2OSCvJA}2YR2Bsl&jN6q)*fXI9575DJzx#P_>s$1f#DOpW zvYGvRKHXZzX(*{c3djfrWZ2-We>?`Q4b&C@b(LTDWaR*?d0J)x*EY@f_7{n$BY=n* z%Wl8OI)i2#gN*Oxrn}VW2`snMk{orS4iS@_8)4xRfD%uFBOu|V;8zEXALexdwUk|< z_G4j!7eM=%7o8m-42vp;Xx%c=z{CqRNc+S4HdDeB#)+GZh zVKn8zs*edj$m3{Ksu+|c*W}mkiTQdA%2reag$M@dyMrTHRQ0_qR$u9kEN5=qu2dD+ z|JHh?;3PG75b1lFeZH{gqvgHMky)6hl({=Y0@k<>s!&D6nqaaljo?QWSONOWBw)O0 zf%1ndxvUCxpgaOn7CEqH^wT0>3`~)RDfHKuNReA}US0%Jm%jqJeq;aLK>+1fKNl!) z0au_cU+ytk-1jP}uxmIl2jB%%DZoNw5+p;i6;L>jh)yng?&$>DKYy72O{WR^ zPhI%`p9k`PzR~{k-TW^ZrXXyAJO81d|NXVRm9cbWBMnVx*CiXVq F{{V`w_3Hot literal 33284 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 Date: Fri, 16 Oct 2026 20:51:23 +0200 Subject: [PATCH 10/30] fix(bridge): the web module's doc states the session lifetime instead of linking a private const Public rustdoc may not link a private item (cargo doc with -D warnings fails on it), so the module doc says what the constant means: 30 days, ended early by a restart since signed-in browsers live in memory only. Co-Authored-By: Claude Code --- crates/bridge-runtime/src/web.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/crates/bridge-runtime/src/web.rs b/crates/bridge-runtime/src/web.rs index 922debd3..c3e4819b 100644 --- a/crates/bridge-runtime/src/web.rs +++ b/crates/bridge-runtime/src/web.rs @@ -14,7 +14,8 @@ //! a signed command, which the engine matches (`engine::web`). Until then the //! browser sees only the sign-in page. The session lives in a cookie the //! server alone can read, and only HTTPS carries it (`__Host-`, `Secure`, -//! `HttpOnly`, `SameSite=Strict`); it lapses after [`SESSION_TTL_MS`]. +//! `HttpOnly`, `SameSite=Strict`); it lapses after 30 days, and a restart +//! ends it, since signed-in browsers are kept in memory only. //! //! Hardening, since a LAN or VPN is not a trusted place: //! - the `Host` must be an IP address, `localhost`, or a host the direct From 7e0993ea6865948e7ed70731fad6adc5f69afa47 Mon Sep 17 00:00:00 2001 From: deymosh <232244450+deymosh@users.noreply.github.com> Date: Fri, 16 Oct 2026 21:03:37 +0200 Subject: [PATCH 11/30] feat(bridge-core): the web page withdraws a code it stops showing The engine honoured every code the page had shown until it lapsed, so a code whose browser had signed out, or had been dropped to make room, still answered a phone "signed in" for a browser that no longer existed. Input::WebSignInWithdrawn removes the code, and the engine's cap is public (MAX_WEB_SIGN_IN_CODES) so the page keeps exactly as many pending. Co-Authored-By: Claude Code --- crates/bridge-core/src/engine/mod.rs | 2 ++ crates/bridge-core/src/engine/web.rs | 13 ++++++++++--- crates/bridge-core/src/io.rs | 4 ++++ crates/bridge-core/src/lib.rs | 2 +- crates/bridge-core/tests/web_sign_in.rs | 9 +++++++++ 5 files changed, 26 insertions(+), 4 deletions(-) diff --git a/crates/bridge-core/src/engine/mod.rs b/crates/bridge-core/src/engine/mod.rs index 4f87f986..4a2388be 100644 --- a/crates/bridge-core/src/engine/mod.rs +++ b/crates/bridge-core/src/engine/mod.rs @@ -27,6 +27,7 @@ mod permission_rules; mod phone; mod session_keys; pub use session_keys::MAX_CLIENTS; +pub use web::MAX_WEB_SIGN_IN_CODES; mod settings; mod terminal; pub use terminal::{TerminalAllowlist, TerminalAuditRecord, TerminalAuditWhat, TerminalConfig, PendingDevice}; @@ -281,6 +282,7 @@ impl Engine { Input::Unpaired { identity } => self.unpair(&identity), Input::Shutdown => self.shutdown(), Input::WebSignInPending { code, expires_ms } => self.on_web_sign_in_pending(code, expires_ms), + Input::WebSignInWithdrawn { code } => self.on_web_sign_in_withdrawn(&code), } self.requester = None; self.flush(); diff --git a/crates/bridge-core/src/engine/web.rs b/crates/bridge-core/src/engine/web.rs index c4b6a7e8..22df480d 100644 --- a/crates/bridge-core/src/engine/web.rs +++ b/crates/bridge-core/src/engine/web.rs @@ -15,8 +15,10 @@ use super::Engine; use crate::io::Effect; /// Codes the page is showing at once; the soonest to lapse goes first past -/// it (the page caps its own pending sign-ins below this). -const MAX_CODES: usize = 64; +/// it. The page caps its own pending sign-ins at this too, and withdraws a +/// code it stops showing ([`crate::Input::WebSignInWithdrawn`]), so the two sets +/// stay the same. +pub const MAX_WEB_SIGN_IN_CODES: usize = 64; /// The codes the web page is showing, with when each lapses (ms). #[derive(Debug, Default)] @@ -41,13 +43,18 @@ impl Engine { let now = self.now(); let codes = &mut self.web_sign_ins.codes; codes.retain(|_, expires| *expires > now); - while codes.len() >= MAX_CODES { + while codes.len() >= MAX_WEB_SIGN_IN_CODES { let Some(soonest) = codes.iter().min_by_key(|(_, e)| **e).map(|(c, _)| c.clone()) else { break }; codes.remove(&soonest); } codes.insert(normalize(&code), expires_ms); } + /// The page stopped showing `code`: no phone may use it any more. + pub(super) fn on_web_sign_in_withdrawn(&mut self, code: &str) { + self.web_sign_ins.codes.remove(&normalize(code)); + } + /// A paired phone sent `code`: sign in the browser showing it, once. The /// answer echoes the code exactly as the phone sent it, so the phone can /// match it to the attempt it is showing however the user typed it. diff --git a/crates/bridge-core/src/io.rs b/crates/bridge-core/src/io.rs index 02ab2328..d970c3b4 100644 --- a/crates/bridge-core/src/io.rs +++ b/crates/bridge-core/src/io.rs @@ -237,6 +237,10 @@ pub enum Input { /// The web page is showing sign-in `code` to a browser until /// `expires_ms`; a paired phone sending it signs that browser in. WebSignInPending { code: String, expires_ms: u64 }, + /// The page no longer shows `code`: its browser signed out, or was + /// dropped to make room, before a phone sent it. A phone sending it now + /// would be told a browser was let in that is no longer there. + WebSignInWithdrawn { code: String }, } #[derive(Debug)] diff --git a/crates/bridge-core/src/lib.rs b/crates/bridge-core/src/lib.rs index 89212ed7..8a777df0 100644 --- a/crates/bridge-core/src/lib.rs +++ b/crates/bridge-core/src/lib.rs @@ -34,7 +34,7 @@ pub mod time; pub use engine::{ Config, Engine, PendingDevice, TerminalAllowlist, TerminalAuditRecord, TerminalAuditWhat, TerminalConfig, - DEFAULT_HEARTBEAT_INTERVAL_MS, MAX_CLIENTS, + DEFAULT_HEARTBEAT_INTERVAL_MS, MAX_CLIENTS, MAX_WEB_SIGN_IN_CODES, }; pub use sync::SyncConfig; pub use io::*; diff --git a/crates/bridge-core/tests/web_sign_in.rs b/crates/bridge-core/tests/web_sign_in.rs index 2e49a88e..a94e5863 100644 --- a/crates/bridge-core/tests/web_sign_in.rs +++ b/crates/bridge-core/tests/web_sign_in.rs @@ -57,3 +57,12 @@ fn a_lapsed_or_unknown_code_signs_nothing_in() { rig.take(); assert_eq!(sign_in(&mut rig, "K7QM-4XPA"), (None, Some(("K7QM-4XPA".into(), false))), "lapsed"); } + +#[test] +fn a_withdrawn_code_signs_nothing_in() { + let mut rig = Rig::new(); + show(&mut rig, "K7QM-4XPA"); + rig.input(Input::WebSignInWithdrawn { code: "K7QM-4XPA".into() }); + rig.take(); + assert_eq!(sign_in(&mut rig, "K7QM-4XPA"), (None, Some(("K7QM-4XPA".into(), false))), "its browser left"); +} From 436dd3491c8a7bd4de1e2fd37ce0334809efda67 Mon Sep 17 00:00:00 2001 From: deymosh <232244450+deymosh@users.noreply.github.com> Date: Fri, 16 Oct 2026 21:03:37 +0200 Subject: [PATCH 12/30] fix(bridge): the web page's caps hold, and IPv6 starts count per /64 - Signed-in browsers are capped at 64 as documented, dropping the longest signed in; before, the only cap counted pending and signed-in browsers together (up to 96) and could drop a browser still showing a live code. - Pending sign-ins are capped at the engine's own count, and every pending browser dropped or signed out withdraws its code from the engine. - The caps drop by an order counter rather than a millisecond clock, which gives two browsers the same age. - Sign-in starts are counted per IPv6 /64 (IPv4-mapped addresses as IPv4): one host owns a whole /64 and could otherwise start without limit. The table of counts is bounded. - The sign-in steps name the phone's row as it is: "Sign in a browser", under "Web page". Co-Authored-By: Claude Code --- crates/bridge-runtime/src/web.rs | 141 ++++++++++++++++++++++++--- crates/bridge-runtime/web/index.html | 2 +- 2 files changed, 127 insertions(+), 16 deletions(-) diff --git a/crates/bridge-runtime/src/web.rs b/crates/bridge-runtime/src/web.rs index c3e4819b..671b0899 100644 --- a/crates/bridge-runtime/src/web.rs +++ b/crates/bridge-runtime/src/web.rs @@ -53,12 +53,17 @@ const BODY_TIMEOUT: Duration = Duration::from_secs(10); pub const PENDING_TTL_MS: u64 = 5 * 60 * 1000; /// How long a signed-in browser stays signed in. const SESSION_TTL_MS: u64 = 30 * 24 * 3600 * 1000; -/// Pending sign-ins kept at once; the oldest goes first past it. -const MAX_PENDING: usize = 32; +/// Pending sign-ins kept at once; the oldest goes first past it. The +/// engine keeps as many codes, and is told of every one dropped here, so a +/// phone is never told it let in a browser this page no longer knows. +const MAX_PENDING: usize = bridge_core::MAX_WEB_SIGN_IN_CODES; /// Signed-in browsers kept at once; the oldest goes first past it. const MAX_SESSIONS: usize = 64; /// Sign-in starts allowed per address per minute. const STARTS_PER_MINUTE: u32 = 10; +/// Addresses whose sign-in starts are counted at once; the oldest windows go +/// first past it, so the count costs bounded memory whatever the peers. +const MAX_START_WINDOWS: usize = 4096; /// The session cookie. `__Host-` makes the browser keep it only when it was /// set over HTTPS, for the whole site, by this exact host. const COOKIE: &str = "__Host-codedeck"; @@ -87,7 +92,9 @@ enum Access { struct Browser { access: Access, peer: IpAddr, - created_ms: u64, + /// When it got where it stands, as a count: what the caps drop the + /// lowest of (a clock can give two browsers the same millisecond). + order: u64, } /// The page's state: the latest heartbeat and the browsers it knows. @@ -100,7 +107,10 @@ pub struct Web { /// By the SHA-256 of the cookie's value, so the table holds no token a /// memory dump could replay. browsers: RefCell>, + /// Sign-in starts in the current minute, by [`rate_key`]. starts: RefCell>, + /// The next [`Browser::order`]. + order: std::cell::Cell, inputs: mpsc::UnboundedSender, /// Sign-in switched off for development (`CODEDECK_WEB_NO_SIGN_IN=1`): /// a browser on a loopback or private address is let in without a @@ -124,6 +134,7 @@ impl Web { heartbeat: RefCell::default(), browsers: RefCell::default(), starts: RefCell::default(), + order: std::cell::Cell::new(1), inputs, no_sign_in, }) @@ -142,8 +153,13 @@ impl Web { if matches!(&browser.access, Access::Pending { code: c, .. } if c == code) { log::info!("[Web] A browser at {} signed in", browser.peer); browser.access = Access::SignedIn { by: by.to_string(), since_ms: now, expires_ms: now + SESSION_TTL_MS }; + // The session's age is from its sign-in, so the cap below + // drops the longest signed in, never the one just let in. + browser.order = self.next_order(); } } + let mut browsers = self.browsers.borrow_mut(); + evict_oldest(&mut browsers, MAX_SESSIONS, |b| matches!(b.access, Access::SignedIn { .. })); } fn browser(&self, token: Option<&str>) -> Option<(String, Browser)> { @@ -167,7 +183,12 @@ impl Web { { let mut starts = self.starts.borrow_mut(); starts.retain(|_, (window, _)| now - *window < 60_000); - let entry = starts.entry(peer).or_insert((now, 0)); + let key = rate_key(peer); + while !starts.contains_key(&key) && starts.len() >= MAX_START_WINDOWS { + let Some(oldest) = starts.iter().min_by_key(|(_, (window, _))| *window).map(|(k, _)| *k) else { break }; + starts.remove(&oldest); + } + let entry = starts.entry(key).or_insert((now, 0)); if entry.1 >= STARTS_PER_MINUTE { return None; } @@ -180,15 +201,33 @@ impl Web { browsers.retain(|_, b| match b.access { Access::Pending { expires_ms, .. } | Access::SignedIn { expires_ms, .. } => expires_ms > now, }); - evict_oldest(&mut browsers, MAX_PENDING, |b| matches!(b.access, Access::Pending { .. })); - browsers.insert(token_key(&token), Browser { access: Access::Pending { code: code.clone(), expires_ms }, peer, created_ms: now }); - evict_oldest(&mut browsers, MAX_SESSIONS + MAX_PENDING, |_| true); + browsers.insert(token_key(&token), Browser { access: Access::Pending { code: code.clone(), expires_ms }, peer, order: self.next_order() }); let _ = self.inputs.send(Input::WebSignInPending { code: code.clone(), expires_ms }); + for dropped in evict_oldest(&mut browsers, MAX_PENDING, |b| matches!(b.access, Access::Pending { .. })) { + self.withdraw(&dropped); + } Some((token, code)) } fn sign_out(&self, key: &str) { - self.browsers.borrow_mut().remove(key); + let removed = self.browsers.borrow_mut().remove(key); + if let Some(browser) = removed { + self.withdraw(&browser); + } + } + + fn next_order(&self) -> u64 { + let order = self.order.get(); + self.order.set(order + 1); + order + } + + /// The page stopped showing a pending browser's code: the engine must not + /// let a phone use it. + fn withdraw(&self, browser: &Browser) { + if let Access::Pending { code, .. } = &browser.access { + let _ = self.inputs.send(Input::WebSignInWithdrawn { code: code.clone() }); + } } fn status_json(&self, by: &str, since_ms: u64) -> String { @@ -205,15 +244,32 @@ impl Web { } /// Drop the oldest browsers matching `which` until at most `cap` of them are -/// left. -fn evict_oldest(browsers: &mut HashMap, cap: usize, which: impl Fn(&Browser) -> bool) { +/// left, and return them. +fn evict_oldest(browsers: &mut HashMap, cap: usize, which: impl Fn(&Browser) -> bool) -> Vec { + let mut dropped = Vec::new(); loop { let matching: Vec<(&String, &Browser)> = browsers.iter().filter(|(_, b)| which(b)).collect(); - if matching.len() < cap.max(1) { - return; + if matching.len() <= cap { + return dropped; } - let Some(oldest) = matching.iter().min_by_key(|(_, b)| b.created_ms).map(|(k, _)| (*k).clone()) else { return }; - browsers.remove(&oldest); + let Some(oldest) = matching.iter().min_by_key(|(_, b)| b.order).map(|(k, _)| (*k).clone()) else { return dropped }; + dropped.extend(browsers.remove(&oldest)); + } +} + +/// What sign-in starts are counted by: an IPv4 address, or an IPv6 +/// address's /64. One host holds a whole /64 and can pick any address in it, +/// so counting single IPv6 addresses would let it start without limit. +fn rate_key(peer: IpAddr) -> IpAddr { + match peer { + IpAddr::V4(v4) => IpAddr::V4(v4), + IpAddr::V6(v6) => match v6.to_ipv4_mapped() { + Some(v4) => IpAddr::V4(v4), + None => { + let s = v6.segments(); + IpAddr::V6(std::net::Ipv6Addr::new(s[0], s[1], s[2], s[3], 0, 0, 0, 0)) + } + }, } } @@ -441,7 +497,7 @@ fn route(request: &Request, peer: IpAddr, web: &Web) -> Response { return Response::error(403); } let browser = if web.no_sign_in && is_local(peer) { - Some((String::new(), Browser { access: Access::SignedIn { by: "sign-in switched off".into(), since_ms: 0, expires_ms: u64::MAX }, peer, created_ms: 0 })) + Some((String::new(), Browser { access: Access::SignedIn { by: "sign-in switched off".into(), since_ms: 0, expires_ms: u64::MAX }, peer, order: 0 })) } else { web.browser(request.cookie.as_deref()) }; @@ -580,6 +636,61 @@ mod tests { assert_eq!(route(&status, PEER, &web).status, 401, "signed out"); } + #[test] + fn an_ipv6_host_is_rate_limited_by_its_slash_64() { + let (web, _) = web(); + for i in 0..STARTS_PER_MINUTE { + let peer = IpAddr::V6(std::net::Ipv6Addr::new(0x2001, 0xdb8, 1, 2, 0, 0, 0, i as u16 + 1)); + assert!(web.start_sign_in(peer).is_some()); + } + let same_64 = IpAddr::V6(std::net::Ipv6Addr::new(0x2001, 0xdb8, 1, 2, 9, 9, 9, 9)); + assert!(web.start_sign_in(same_64).is_none(), "another address in the same /64 counts as the same host"); + let other_64 = IpAddr::V6(std::net::Ipv6Addr::new(0x2001, 0xdb8, 1, 3, 0, 0, 0, 1)); + assert!(web.start_sign_in(other_64).is_some()); + } + + #[test] + fn a_pending_browser_dropped_or_signed_out_withdraws_its_code() { + let (web, mut inputs) = web(); + let mut first = None; + for i in 0..=MAX_PENDING { + // A peer of its own each, so the rate limit does not interfere. + let peer = IpAddr::V4(std::net::Ipv4Addr::new(10, 0, (i / 250) as u8, (i % 250) as u8 + 1)); + let (token, code) = web.start_sign_in(peer).expect("a start"); + first.get_or_insert((token, code)); + } + let (first_token, first_code) = first.unwrap(); + let withdrawn: Vec = std::iter::from_fn(|| inputs.try_recv().ok()) + .filter_map(|input| match input { + Input::WebSignInWithdrawn { code } => Some(code), + _ => None, + }) + .collect(); + assert_eq!(withdrawn, vec![first_code], "the oldest pending browser made room, and its code went with it"); + assert!(web.browser(Some(&first_token)).is_none()); + + let (token, code) = web.start_sign_in(IpAddr::V4(std::net::Ipv4Addr::new(10, 9, 9, 9))).unwrap(); + while inputs.try_recv().is_ok() {} + web.sign_out(&token_key(&token)); + assert!(matches!(inputs.try_recv(), Ok(Input::WebSignInWithdrawn { code: c }) if c == code)); + } + + #[test] + fn signed_in_browsers_are_capped_by_the_longest_signed_in() { + let (web, _) = web(); + let mut tokens = Vec::new(); + for i in 0..=MAX_SESSIONS { + let peer = IpAddr::V4(std::net::Ipv4Addr::new(10, 1, (i / 250) as u8, (i % 250) as u8 + 1)); + let (token, code) = web.start_sign_in(peer).unwrap(); + web.signed_in(&code, "npub1owner"); + tokens.push(token); + } + let signed_in = web.browsers.borrow().values().filter(|b| matches!(b.access, Access::SignedIn { .. })).count(); + assert_eq!(signed_in, MAX_SESSIONS); + assert!(web.browser(Some(&tokens[0])).is_none(), "the first one signed in went first"); + assert!(web.browser(tokens.last().map(String::as_str)).is_some(), "never the one just let in"); + } + #[test] fn sign_in_starts_are_rate_limited_per_address() { let (web, _) = web(); diff --git a/crates/bridge-runtime/web/index.html b/crates/bridge-runtime/web/index.html index 009267dc..b1565c82 100644 --- a/crates/bridge-runtime/web/index.html +++ b/crates/bridge-runtime/web/index.html @@ -34,7 +34,7 @@

Sign in with your phone

  1. Open CodeDeck+ on a phone paired with this bridge.
  2. -
  3. On the machine's page, choose Sign in to the web page.
  4. +
  5. On the machine's page, under Web page, choose Sign in a browser.
  6. Scan this code, or type it.

From 41a499093dc686477ab2830796ab0b163dafcbc4 Mon Sep 17 00:00:00 2001 From: deymosh <232244450+deymosh@users.noreply.github.com> Date: Fri, 16 Oct 2026 21:03:37 +0200 Subject: [PATCH 13/30] fix(client): a resent web sign-in code that was refused stays signed in A code works once. When the first answer was late and the phone sent the code again, the first answer signed the browser in and the second, for the same code, was a refusal that turned the screen to "did not match". A refusal of a code that already signed in now leaves the entry as it is. Co-Authored-By: Claude Code --- crates/client-core/src/stores/ui.rs | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/crates/client-core/src/stores/ui.rs b/crates/client-core/src/stores/ui.rs index ee335857..7f13c0c5 100644 --- a/crates/client-core/src/stores/ui.rs +++ b/crates/client-core/src/stores/ui.rs @@ -302,13 +302,17 @@ impl UiState { /// The bridge's answer to a `web-sign-in` on this machine, which moves the /// entry only when it answers the code recorded now — an answer to an - /// older code says nothing about the attempt on screen. Whether the entry + /// older code says nothing about the attempt on screen. Once a code has + /// signed a browser in, a later refusal of the same code does not undo + /// it: a code works once, so the answer to a resend of it (the phone sent + /// it again while the first answer was late) is always a refusal, and + /// says nothing about the browser it already let in. Whether the entry /// moved. pub fn apply_web_sign_in_result(&mut self, machine_pubkey: &str, code: &str, signed_in: bool) -> bool { let Some(entry) = self.web_sign_in.get_mut(machine_pubkey) else { return false; }; - if entry.code != code { + if entry.code != code || (!signed_in && entry.state == WebSignInState::SignedIn) { return false; } entry.state = if signed_in { @@ -466,6 +470,17 @@ mod tests { assert_eq!(ui.web_sign_in["m"].state, WebSignInState::NotMatched); } + #[test] + fn a_resent_code_refused_after_it_signed_in_stays_signed_in() { + let mut ui = UiState::default(); + ui.note_web_sign_in_sent("m", "K7QM-4XPA"); + // The first answer was late, so the code went again. + ui.note_web_sign_in_sent("m", "K7QM-4XPA"); + assert!(ui.apply_web_sign_in_result("m", "K7QM-4XPA", true)); + assert!(!ui.apply_web_sign_in_result("m", "K7QM-4XPA", false), "the resend was refused because the code was used"); + assert_eq!(ui.web_sign_in["m"].state, WebSignInState::SignedIn); + } + #[test] fn a_late_answer_to_an_older_code_is_ignored() { let mut ui = UiState::default(); From 0c2f2d00ce2e4adf490d1d92d26add7d0e43d5a7 Mon Sep 17 00:00:00 2001 From: deymosh <232244450+deymosh@users.noreply.github.com> Date: Fri, 16 Oct 2026 21:03:37 +0200 Subject: [PATCH 14/30] fix(android): the web sign-in shows the bridge's late verdict, and every send waits anew "No answer" was set after 15 s and cleared only by a new send, so a refusal arriving later stayed hidden behind it; any change of the answer now clears it. A resend of the same code changed none of the wait's keys, so it got no wait of its own and could spin forever; the wait is keyed on the attempt. Co-Authored-By: Claude Code --- .../java/com/codedeck/plus/ui/screens/MachineWebPage.kt | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/apps/android/app/src/main/java/com/codedeck/plus/ui/screens/MachineWebPage.kt b/apps/android/app/src/main/java/com/codedeck/plus/ui/screens/MachineWebPage.kt index dffb32bb..5fb6a90d 100644 --- a/apps/android/app/src/main/java/com/codedeck/plus/ui/screens/MachineWebPage.kt +++ b/apps/android/app/src/main/java/com/codedeck/plus/ui/screens/MachineWebPage.kt @@ -22,6 +22,7 @@ import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope @@ -226,17 +227,23 @@ fun WebSignInScreen(core: CoreHost, pubkey: String, onBack: () -> Unit) { var notice by remember { mutableStateOf(null) } var noAnswer by remember { mutableStateOf(false) } var scanOpen by remember { mutableStateOf(false) } + // Each send waits for its own answer, a resend of the same code too. + var attempt by remember { mutableIntStateOf(0) } fun send(sent: String) { notice = null noAnswer = false + attempt++ scope.launch { core.dispatch(UniffiIntent.WebSignIn(pubkey, sent)) } } DisposableEffect(pubkey) { onDispose { core.dispatchDetached(UniffiIntent.ClearWebSignIn(pubkey)) } } - LaunchedEffect(signIn?.code, signIn?.state) { + // An answer, however late, replaces "no answer": the bridge's own verdict + // (did not match, signed in) is what the user needs to read. + LaunchedEffect(attempt, signIn?.code, signIn?.state) { + noAnswer = false if (signIn?.state == UniffiWebSignInState.SENDING) { delay(ANSWER_WAIT_MS) noAnswer = true From 64c871bbedf61bc0d10bb1e9eb1b6694cccf4cf5 Mon Sep 17 00:00:00 2001 From: deymosh <232244450+deymosh@users.noreply.github.com> Date: Fri, 16 Oct 2026 21:07:40 +0200 Subject: [PATCH 15/30] docs: the README lists the bridge's web page Co-Authored-By: Claude Code --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 035c0df4..b283ea5d 100644 --- a/README.md +++ b/README.md @@ -53,6 +53,9 @@ Pairing is a one-time QR scan; it survives restarts on both ends. - NIP-42 `AUTH` relays, and Tor on both ends (see below) - A direct link on your LAN or VPN: the phone talks to the bridge over its own WebSocket, with the relays as the fallback +- A web page on the same port: the bridge's dashboard in a browser, signed in + from a paired phone instead of a password + ([`docs/BRIDGE.md`](docs/BRIDGE.md#web-page)) ## About this fork From ba8a9c0af55783927ea89c20499dda332327b1e8 Mon Sep 17 00:00:00 2001 From: deymosh <232244450+deymosh@users.noreply.github.com> Date: Fri, 16 Oct 2026 21:09:18 +0200 Subject: [PATCH 16/30] feat(bridge): the web page gets tabs, and a Usage tab from the heartbeat The dashboard is now tabs (Overview, Usage) on the hash, rendered from the status the page already polls, so switching tabs costs no request. Usage shows, per agent, its sessions, what runs or waits now, transcript size and the models in use, then every session's context fill, fullest first. All of it is what the heartbeat already carries: nothing new is asked of the bridge or the agents. Session states are read as the heartbeat names them: a session waiting for a permission or an answer showed its raw state in grey, since the page looked for a "waiting" state that does not exist. Co-Authored-By: Claude Code --- crates/bridge-runtime/web/app.css | 14 +++++ crates/bridge-runtime/web/app.js | 92 ++++++++++++++++++++++++++-- crates/bridge-runtime/web/index.html | 22 +++++++ 3 files changed, 123 insertions(+), 5 deletions(-) diff --git a/crates/bridge-runtime/web/app.css b/crates/bridge-runtime/web/app.css index 6130e9f6..df893cad 100644 --- a/crates/bridge-runtime/web/app.css +++ b/crates/bridge-runtime/web/app.css @@ -87,6 +87,20 @@ table.sessions { width: 100%; border-collapse: collapse; } .sessions .folder { color: var(--dim); max-width: 220px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .sessions .when { color: var(--dim); white-space: nowrap; } +.tabs { display: flex; gap: 4px; margin: -4px 0 20px; border-bottom: 1px solid var(--line); overflow-x: auto; } +.tabs a { color: var(--dim); text-decoration: none; padding: 10px 14px; border-bottom: 2px solid transparent; margin-bottom: -1px; white-space: nowrap; } +.tabs a:hover { color: var(--text); } +.tabs a.on { color: var(--text); border-bottom-color: var(--text); } + +.meters { display: flex; flex-direction: column; gap: 14px; } +.meter-head { display: flex; justify-content: space-between; gap: 12px; margin-bottom: 6px; } +.meter-title { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; } +.meter-head .small { white-space: nowrap; } +.meter-track { height: 6px; background: var(--raised); border-radius: 999px; overflow: hidden; } +.meter-fill { height: 100%; background: var(--text); border-radius: 999px; } +.meter-fill.busy { background: var(--busy); } +.meter-fill.bad { background: var(--bad); } + @media (max-width: 600px) { main { padding: 16px; } .bar { padding: 12px 16px; } diff --git a/crates/bridge-runtime/web/app.js b/crates/bridge-runtime/web/app.js index 756b2402..a4c3a584 100644 --- a/crates/bridge-runtime/web/app.js +++ b/crates/bridge-runtime/web/app.js @@ -4,8 +4,12 @@ "use strict"; const views = ["loading", "signed-out", "pending", "dashboard"]; +const tabs = ["overview", "usage"]; let pollTimer = null; let expiresAt = 0; +// The latest status, so switching tabs renders at once instead of waiting +// for the next poll. +let lastStatus = null; const $ = (id) => document.getElementById(id); @@ -101,10 +105,18 @@ function relative(iso) { return new Date(at).toLocaleDateString(); } +// A session's state as the heartbeat names it, as a word and a colour. +const STATES = { + idle: ["idle", "ok"], + running: ["running", "busy"], + waiting_permission: ["waiting for a permission", "busy"], + waiting_question: ["waiting for an answer", "busy"], + offline: ["offline", ""], +}; + function stateOf(session) { - const state = session.state || "idle"; - const tone = { running: "busy", waiting: "busy", idle: "ok", error: "bad", offline: "" }[state] ?? ""; - return el("span", { class: `state ${tone}` }, state); + const [label, tone] = STATES[session.state || "idle"] ?? [session.state, ""]; + return el("span", { class: `state ${tone}` }, label); } function installOf(agent) { @@ -128,15 +140,38 @@ function facts(target, rows) { target.replaceChildren(...rows.flatMap(([k, v]) => [el("dt", {}, k), el("dd", {}, v)])); } +function currentTab() { + const tab = location.hash.slice(1); + return tabs.includes(tab) ? tab : "overview"; +} + async function dashboard() { const { status, body } = await api("/api/status"); if (status === 401) return refresh(); if (status !== 200) return schedule(dashboard, 5000); + lastStatus = body; show("dashboard"); + render(); + schedule(dashboard, 5000); +} + +/** The dashboard's frame and the open tab, from the latest status. */ +function render() { + const body = lastStatus; + if (!body) return; $("no-sign-in").hidden = !body.noSignIn; const hb = body.heartbeat || {}; $("machine").textContent = hb.machine || ""; document.title = `${hb.machine || "Bridge"} · CodeDeck+`; + const tab = currentTab(); + for (const link of document.querySelectorAll("[data-tab]")) link.classList.toggle("on", link.dataset.tab === tab); + for (const pane of document.querySelectorAll("[data-pane]")) pane.hidden = pane.dataset.pane !== tab; + $("signed-in-as").textContent = `Signed in by ${body.signedInBy.slice(0, 16)}… ${relative(body.signedInSince)}.`; + if (tab === "usage") usage(hb); + else overview(body, hb); +} + +function overview(body, hb) { facts($("bridge-facts"), [ ["Machine", hb.machine || "—"], @@ -169,10 +204,57 @@ async function dashboard() { el("td", { class: "folder", title: s.cwd }, s.project || s.cwd), el("td", { class: "when" }, relative(s.lastActivity)), ))); - $("signed-in-as").textContent = `Signed in by ${body.signedInBy.slice(0, 16)}… ${relative(body.signedInSince)}.`; - schedule(dashboard, 5000); } +/** How many of `values` there are of each, most first. */ +function tally(values) { + const counts = new Map(); + for (const v of values) if (v) counts.set(v, (counts.get(v) || 0) + 1); + return [...counts].sort((a, b) => b[1] - a[1]); +} + +function usage(hb) { + const sessions = hb.sessions || []; + const agentName = Object.fromEntries((hb.agents || []).map((a) => [a.id, a.displayName])); + const byAgent = tally(sessions.map((s) => s.agent)); + $("usage-empty").hidden = byAgent.length > 0; + $("usage-agents").replaceChildren(...byAgent.map(([agent, count]) => { + const own = sessions.filter((s) => s.agent === agent); + const running = own.filter((s) => s.state === "running").length; + const waiting = own.filter((s) => s.state === "waiting_permission" || s.state === "waiting_question").length; + const lines = own.reduce((sum, s) => sum + (s.lineCount || 0), 0); + const models = tally(own.map((s) => s.model)); + return el("div", { class: "agent" }, + el("div", { class: "agent-head" }, el("span", { class: "agent-name" }, agentName[agent] || agent), el("span", { class: "dim small" }, `${count} session${count === 1 ? "" : "s"}`)), + el("dl", { class: "facts small" }, + el("dt", {}, "Now"), el("dd", {}, running || waiting ? [running && `${running} running`, waiting && `${waiting} waiting`].filter(Boolean).join(" · ") : "idle"), + el("dt", {}, "Transcripts"), el("dd", {}, `${lines.toLocaleString()} lines`), + ...(models.length ? [el("dt", {}, "Models"), el("dd", {}, el("span", { class: "chips" }, ...models.map(([m, n]) => el("span", { class: "chip" }, n > 1 ? `${m} ×${n}` : m))))] : []), + ), + ); + })); + + const measured = sessions.filter((s) => typeof s.contextPercentage === "number") + .sort((a, b) => b.contextPercentage - a.contextPercentage); + $("usage-context-empty").hidden = measured.length > 0; + $("usage-context").replaceChildren(...measured.map((s) => { + const pct = Math.max(0, Math.min(100, s.contextPercentage)); + const tone = pct >= 90 ? "bad" : pct >= 70 ? "busy" : ""; + const size = s.contextWindow ? ` of ${Math.round(s.contextWindow / 1000)}k` : ""; + // Through the CSSOM: the page's CSP refuses a style attribute. + const fill = el("div", { class: `meter-fill ${tone}` }); + fill.style.width = `${pct}%`; + return el("div", { class: "meter" }, + el("div", { class: "meter-head" }, + el("span", { class: "meter-title", title: s.title || s.slug }, s.title || s.slug), + el("span", { class: "dim small" }, `${agentName[s.agent] || s.agent} · ${Math.round(pct)}%${window}`)), + el("div", { class: "meter-track" }, fill), + ); + })); +} + +window.addEventListener("hashchange", render); + $("start").addEventListener("click", start); $("sign-out").addEventListener("click", async () => { await api("/api/sign-out", "POST"); diff --git a/crates/bridge-runtime/web/index.html b/crates/bridge-runtime/web/index.html index b1565c82..f6e6eb62 100644 --- a/crates/bridge-runtime/web/index.html +++ b/crates/bridge-runtime/web/index.html @@ -42,6 +42,12 @@

Sign in with your phone

+ + +

Bridge

@@ -66,6 +72,22 @@

Sessions

+ + + +

From d7ca392110470255394d0055aba5115ea660fd4d Mon Sep 17 00:00:00 2001 From: deymosh <232244450+deymosh@users.noreply.github.com> Date: Fri, 16 Oct 2026 21:15:06 +0200 Subject: [PATCH 17/30] feat(bridge): the web page's APIs for browsers, devices and the safe config set MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-in browsers now survive a restart: the page keeps them in `/web-sessions.json`, owner-only (0600) and written atomically, keyed by the cookie's SHA-256 — never the token, so a copy of the file cannot be replayed as a cookie. Pending sign-ins are not written, a missing or corrupt file starts empty (with a warning), and `lastSeenMs` moves in memory on every authenticated request while reaching the disk at most once a minute. Each browser also keeps the request's User-Agent (control characters stripped, at most 120 characters) so the owner can tell one from another. Three JSON APIs follow, all needing a signed-in browser (401 otherwise) and, for a POST, the page's own Origin as before: - `GET /api/browsers` lists the signed-in browsers and `POST /api/browsers/sign-out` ends one by the first 16 hex characters of its key (404 when unknown). Any signed-in browser may end any other: they are all the owner's. - `GET /api/devices` shows the paired identities and their clients (labels and key expiries). The runtime hands the page the snapshot alongside the heartbeat and on every pairing change, and it carries nothing secret — not even a session key's public half. - `GET /api/config` shows the config as it is in effect and `POST /api/config` changes only the safe set — the machine name, the relays, the direct endpoints, the transcript retention and the relay/Blossom registration tokens. Each value is validated, then written back keeping every other key (including ones this bridge does not know). A secret is shown only as set/not set, its value never reaches a response or a log line, and every field says whether a flag or environment variable overrides the file. The safe set is deliberately small: the other keys name paths, listeners or process settings whose change could break a running bridge, so the page has no business writing them. Co-Authored-By: Claude Code --- crates/bridge-runtime/src/config.rs | 288 +++++++++- crates/bridge-runtime/src/direct.rs | 4 +- crates/bridge-runtime/src/runtime.rs | 10 +- crates/bridge-runtime/src/web.rs | 769 ++++++++++++++++++++++++-- crates/bridge-runtime/tests/direct.rs | 6 +- docs/BRIDGE.md | 26 +- 6 files changed, 1033 insertions(+), 70 deletions(-) diff --git a/crates/bridge-runtime/src/config.rs b/crates/bridge-runtime/src/config.rs index 301c8ddc..762e2f38 100644 --- a/crates/bridge-runtime/src/config.rs +++ b/crates/bridge-runtime/src/config.rs @@ -2,7 +2,7 @@ //! `$CODEDECK_HOME/config.json` > defaults. Same keys as the TypeScript //! bridge's config, so an existing `config.json` keeps working. -use std::collections::BTreeMap; +use std::collections::{BTreeMap, BTreeSet}; use std::fs; use std::net::SocketAddr; use std::path::{Path, PathBuf}; @@ -10,6 +10,7 @@ use std::path::{Path, PathBuf}; use protocol::capabilities::BridgeHostKind; use protocol::relays::DEFAULT_RELAYS; use serde::Deserialize; +use serde_json::Value; /// Flags that feed configuration (the rest of the CLI lives in `main.rs`). #[derive(Debug, Default, Clone)] @@ -135,9 +136,12 @@ impl DirectConfig { } } -/// Whether `url` is a direct endpoint a phone may dial: `wss://` anywhere, -/// `ws://` only to an onion service. -pub fn is_direct_endpoint(url: &str) -> bool { +/// Whether `url` is a WebSocket URL that may carry the bridge's traffic: +/// `wss://` anywhere, `ws://` only to an onion service. Cleartext never +/// leaves the machine except inside Tor, so a `ws://` host that is not a +/// `.onion` is refused wherever such a URL is accepted — relays and direct +/// endpoints alike. +fn is_wss_or_onion(url: &str) -> bool { let host = |rest: &str| rest.split(['/', ':']).next().unwrap_or("").to_ascii_lowercase(); if let Some(rest) = url.strip_prefix("wss://") { !host(rest).is_empty() @@ -148,6 +152,16 @@ pub fn is_direct_endpoint(url: &str) -> bool { } } +/// Whether `url` is a direct endpoint a phone may dial. +pub fn is_direct_endpoint(url: &str) -> bool { + is_wss_or_onion(url) +} + +/// Whether `url` is a relay a phone or the bridge may connect to. +pub fn is_relay_url(url: &str) -> bool { + is_wss_or_onion(url) +} + fn direct_config(flags: &Flags, file: Option) -> Result { let file = file.unwrap_or_default(); let addr = |what: &str, value: Option| -> Result, String> { @@ -306,6 +320,10 @@ pub struct Config { pub terminal: TerminalSettings, /// How the terminal audit is kept. pub audit: AuditSettings, + /// The config-file keys a command-line flag or a `CODEDECK_*` variable + /// overrode. The page's config API reports these as `overridden`, since + /// an edit of the file would not take effect while the override stands. + pub overridden: BTreeSet, } /// Read an env var; empty counts as unset (Compose's `${VAR:-}` defines every @@ -542,10 +560,175 @@ pub fn load(flags: &Flags) -> Result { direct, terminal, audit, + overridden: overridden_keys(flags), home, }) } +/// The config-file keys a flag or a `CODEDECK_*` variable supplied, named as +/// they are in the file (`direct.listen` for the nested key). Read from the +/// same sources `load` reads, so the two cannot drift. +fn overridden_keys(flags: &Flags) -> BTreeSet { + let mut keys = BTreeSet::new(); + let mut mark = |set: bool, key: &str| { + if set { + keys.insert(key.to_string()); + } + }; + mark(flags.machine_name.is_some() || env("CODEDECK_MACHINE_NAME").is_some(), "machineName"); + mark(!flags.relays.is_empty() || env("CODEDECK_RELAYS").is_some(), "relays"); + mark(!flags.workspaces.is_empty() || env("CODEDECK_WORKSPACE_ROOTS").is_some(), "workspaceRoots"); + mark(env("CODEDECK_RELAY_REGISTER_ENDPOINT").is_some(), "relayRegisterEndpoint"); + mark(env("CODEDECK_RELAY_REGISTER_TOKEN").is_some(), "relayRegisterToken"); + mark(env("CODEDECK_BLOSSOM_REGISTER_ENDPOINT").is_some(), "blossomRegisterEndpoint"); + mark(env("CODEDECK_BLOSSOM_REGISTER_TOKEN").is_some(), "blossomRegisterToken"); + mark(env("CODEDECK_TRANSCRIPT_KEEP_LAST").is_some(), "transcriptKeepLast"); + mark(flags.tor_proxy.is_some() || env("CODEDECK_TOR_PROXY_URL").is_some(), "torProxyUrl"); + mark(env("CODEDECK_NODE_PATH").is_some(), "nodePath"); + mark(flags.agent_host.is_some() || env("CODEDECK_AGENT_HOST").is_some(), "agentHostPath"); + mark(flags.test_mode || env_bool("CODEDECK_TEST_MODE").is_some(), "testMode"); + mark(flags.direct_listen.is_some() || env("CODEDECK_DIRECT_LISTEN").is_some(), "direct.listen"); + mark(flags.direct_onion_listen.is_some() || env("CODEDECK_DIRECT_ONION_LISTEN").is_some(), "direct.onionListen"); + mark(!flags.direct_endpoints.is_empty() || env("CODEDECK_DIRECT_ENDPOINTS").is_some(), "direct.endpoints"); + keys +} + +/// The config-file keys a signed-in browser may change through the page's +/// config API — the "safe set". Everything else stays read-only: the other +/// keys name paths, listeners or process settings whose change could break a +/// running bridge, so the page has no business writing them. +pub const WEB_EDITABLE: [&str; 4] = ["machineName", "relays", "direct.endpoints", "transcriptKeepLast"]; + +/// The secrets the page may set or clear. Write-only: the page never reads +/// one back, so a token can be replaced but never leaked. +pub const WEB_EDITABLE_SECRETS: [&str; 2] = ["relayRegisterToken", "blossomRegisterToken"]; + +/// Check one value the page wants to write for a safe-set key. The rules +/// mirror what `load` accepts, so a written file is one the bridge would +/// read back. +pub fn validate_web_value(key: &str, value: &Value) -> Result<(), String> { + match key { + "machineName" => { + let name = value.as_str().ok_or("machineName: expected a string")?; + let chars = name.chars().count(); + if !(1..=64).contains(&chars) { + return Err(format!("machineName: 1 to 64 characters, got {chars}")); + } + if name.chars().any(char::is_control) { + return Err("machineName: no control characters".into()); + } + Ok(()) + } + "relays" => { + let urls = value.as_array().ok_or("relays: expected an array of URLs")?; + if urls.is_empty() { + return Err("relays: name at least one relay".into()); + } + for url in urls { + let url = url.as_str().ok_or("relays: every entry must be a string")?; + if !is_relay_url(url) { + return Err(format!("relays: {url:?} must be wss://, or ws:// only to a .onion")); + } + } + Ok(()) + } + "direct.endpoints" => { + let urls = value.as_array().ok_or("direct.endpoints: expected an array of URLs")?; + for url in urls { + let url = url.as_str().ok_or("direct.endpoints: every entry must be a string")?; + if !is_direct_endpoint(url) { + return Err(format!("direct.endpoints: {url:?} must be wss://, or ws:// only to a .onion")); + } + } + Ok(()) + } + "transcriptKeepLast" => match value { + Value::Null => Ok(()), + Value::Number(n) if n.as_u64().is_some() => Ok(()), + _ => Err("transcriptKeepLast: a whole number of transcripts, or null".into()), + }, + _ => Err(format!("{key}: not a setting the page may change")), + } +} + +/// Check one value the page wants to write for a secret key: a non-empty +/// token, or `null` to clear it. +pub fn validate_web_secret(key: &str, value: &Value) -> Result<(), String> { + match value { + Value::Null => Ok(()), + Value::String(s) if !s.is_empty() => Ok(()), + _ => Err(format!("{key}: a non-empty token, or null to clear")), + } +} + +/// Change the given config-file keys and write the file back atomically, +/// keeping every other key — including ones this bridge does not know — +/// exactly as it was. `None` removes a key (clearing a token, or the +/// retention limit). The file may hold admin tokens, so it stays 0600. +pub fn write_web_settings(path: &Path, changes: &[(String, Option)]) -> Result<(), String> { + let mut root: Value = match fs::read_to_string(path) { + Ok(raw) => serde_json::from_str(&raw).map_err(|e| format!("invalid config in {}: {e}", path.display()))?, + Err(e) if e.kind() == std::io::ErrorKind::NotFound => serde_json::json!({}), + Err(e) => return Err(format!("cannot read {}: {e}", path.display())), + }; + let obj = root.as_object_mut().ok_or_else(|| format!("{} does not hold a JSON object", path.display()))?; + for (key, value) in changes { + match key.as_str() { + "direct.endpoints" => { + let direct = obj.entry("direct").or_insert_with(|| serde_json::json!({})); + let direct = direct.as_object_mut().ok_or("direct is not a JSON object")?; + set_or_remove(direct, "endpoints", value.clone()); + } + plain => set_or_remove(obj, plain, value.clone()), + } + } + let json = serde_json::to_vec_pretty(&root).map_err(|e| e.to_string())?; + crate::state::write_private(path, &json).map_err(|e| format!("cannot write {}: {e}", path.display())) +} + +fn set_or_remove(obj: &mut serde_json::Map, key: &str, value: Option) { + match value { + Some(value) => { + obj.insert(key.to_string(), value); + } + None => { + obj.remove(key); + } + } +} + +/// The page's view of the config: every field as it is in effect, with +/// whether the page may change it, whether it is a secret (shown only as +/// set/not set), and whether a flag or environment variable overrides the +/// file — an edit of an overridden field would not take effect. +pub fn web_config_fields(config: &Config) -> Vec { + let overridden = |key: &str| config.overridden.contains(key); + let field = |key: &str, value: Value, editable: bool| { + serde_json::json!({ "key": key, "value": value, "editable": editable, "secret": false, "overridden": overridden(key) }) + }; + let secret = |key: &str, set: bool, editable: bool| { + serde_json::json!({ "key": key, "set": set, "editable": editable, "secret": true, "overridden": overridden(key) }) + }; + let path = |p: &Path| p.to_string_lossy().into_owned(); + vec![ + field("machineName", Value::from(config.machine.clone()), true), + field("relays", serde_json::json!(config.relays), true), + field("direct.endpoints", serde_json::json!(config.direct.endpoints), true), + field("transcriptKeepLast", config.transcript_keep_last.map(|n| Value::from(n as u64)).unwrap_or(Value::Null), true), + field("workspaceRoots", serde_json::json!(config.workspace_roots.iter().map(|p| path(p)).collect::>()), false), + field("torProxyUrl", config.tor_proxy.clone().map(Value::from).unwrap_or(Value::Null), false), + field("nodePath", Value::from(config.node_path.clone()), false), + field("agentHostPath", Value::from(path(&config.agent_host_path)), false), + field("testMode", Value::from(config.test_mode), false), + field("direct.listen", config.direct.listen.map(|a| Value::from(a.to_string())).unwrap_or(Value::Null), false), + field("direct.onionListen", config.direct.onion_listen.map(|a| Value::from(a.to_string())).unwrap_or(Value::Null), false), + field("relayRegisterEndpoint", config.relay_register.as_ref().map(|r| Value::from(r.url.clone())).unwrap_or(Value::Null), false), + field("blossomRegisterEndpoint", config.blossom_register.as_ref().map(|r| Value::from(r.url.clone())).unwrap_or(Value::Null), false), + secret("relayRegisterToken", config.relay_register.is_some(), true), + secret("blossomRegisterToken", config.blossom_register.is_some(), true), + ] +} + #[cfg(test)] mod tests { use super::*; @@ -768,4 +951,101 @@ mod tests { let err = load(&Flags { home: Some(dir.path().into()), ..Default::default() }).unwrap_err(); assert!(err.contains("invalid config")); } + + #[test] + fn the_safe_set_validates_names_relays_and_endpoints() { + // A machine name: 1 to 64 characters, no control characters. + assert!(validate_web_value("machineName", &Value::from("laptop")).is_ok()); + assert!(validate_web_value("machineName", &Value::from("")).is_err()); + assert!(validate_web_value("machineName", &Value::from("a".repeat(65))).is_err()); + assert!(validate_web_value("machineName", &Value::from("two\nlines")).is_err()); + // Relays: wss:// anywhere, ws:// only to a .onion, at least one. + assert!(validate_web_value("relays", &serde_json::json!(["wss://relay.example", "ws://abc.onion:80"])).is_ok()); + assert!(validate_web_value("relays", &serde_json::json!(["ws://192.168.1.9:7447"])).is_err()); + assert!(validate_web_value("relays", &serde_json::json!([])).is_err()); + // Direct endpoints: the same rule, but an empty list is allowed. + assert!(validate_web_value("direct.endpoints", &serde_json::json!([])).is_ok()); + assert!(validate_web_value("direct.endpoints", &serde_json::json!(["wss://192.168.1.9:7447"])).is_ok()); + assert!(validate_web_value("direct.endpoints", &serde_json::json!(["https://x"])).is_err()); + // Retention: a whole number, or null to clear. + assert!(validate_web_value("transcriptKeepLast", &Value::from(0)).is_ok()); + assert!(validate_web_value("transcriptKeepLast", &Value::Null).is_ok()); + assert!(validate_web_value("transcriptKeepLast", &Value::from(-1)).is_err()); + // Anything else is not the page's to change. + assert!(validate_web_value("nodePath", &Value::from("/usr/bin/node")).is_err()); + assert!(validate_web_secret("relayRegisterToken", &Value::from("tok")).is_ok()); + assert!(validate_web_secret("relayRegisterToken", &Value::Null).is_ok()); + assert!(validate_web_secret("relayRegisterToken", &Value::from("")).is_err()); + } + + #[test] + fn writing_settings_keeps_unknown_keys_and_clears_on_none() { + let dir = tempfile::tempdir().unwrap(); + let path = dir.path().join("config.json"); + fs::write(&path, r#"{"machineName":"desktop","direct":{"listen":"0.0.0.0:7447"},"keepMe":{"x":1}}"#).unwrap(); + let changes = vec![ + ("machineName".to_string(), Some(Value::from("laptop"))), + ("direct.endpoints".to_string(), Some(serde_json::json!(["wss://192.168.1.9:7447"]))), + ("relayRegisterToken".to_string(), Some(Value::from("tok"))), + ]; + write_web_settings(&path, &changes).unwrap(); + let written: Value = serde_json::from_str(&fs::read_to_string(&path).unwrap()).unwrap(); + assert_eq!(written["machineName"], "laptop"); + assert_eq!(written["direct"]["endpoints"][0], "wss://192.168.1.9:7447"); + assert_eq!(written["direct"]["listen"], "0.0.0.0:7447", "a key beside the changed one is kept"); + assert_eq!(written["keepMe"]["x"], 1, "an unknown key is kept"); + assert_eq!(written["relayRegisterToken"], "tok"); + + // None clears: the key comes out, everything else stays. + write_web_settings(&path, &[("relayRegisterToken".to_string(), None)]).unwrap(); + let written: Value = serde_json::from_str(&fs::read_to_string(&path).unwrap()).unwrap(); + assert!(written.get("relayRegisterToken").is_none()); + assert_eq!(written["machineName"], "laptop"); + + // A missing file starts from an empty object. + let fresh = dir.path().join("fresh.json"); + write_web_settings(&fresh, &[("machineName".to_string(), Some(Value::from("new")))]).unwrap(); + assert_eq!(serde_json::from_str::(&fs::read_to_string(&fresh).unwrap()).unwrap()["machineName"], "new"); + } + + #[test] + fn the_config_view_shows_secrets_as_set_or_not_and_marks_overrides() { + let config = Config { + home: PathBuf::from("/home/me/.codedeck"), + config_file: PathBuf::from("/home/me/.codedeck/config.json"), + config_file_exists: true, + machine: "desktop".into(), + host_kind: BridgeHostKind::Cli, + relays: vec!["wss://relay.example".into()], + workspace_roots: vec![PathBuf::from("/srv/w")], + relay_register: Some(RegisterEndpoint { url: "https://relay.example/admin".into(), token: "s3cret".into() }), + blossom_register: None, + tor_proxy: Some("127.0.0.1:9050".into()), + transcript_keep_last: Some(5), + node_path: "node".into(), + agent_host_path: PathBuf::from("/opt/agent-host/dist/main.js"), + test_mode: false, + host_env: BTreeMap::new(), + direct: DirectConfig { listen: Some("0.0.0.0:7447".parse().unwrap()), onion_listen: None, endpoints: vec![] }, + terminal: TerminalSettings::default(), + audit: AuditSettings::default(), + overridden: BTreeSet::from(["machineName".to_string()]), + }; + let fields = web_config_fields(&config); + let of = |key: &str| fields.iter().find(|f| f["key"] == key).unwrap().clone(); + assert_eq!(of("machineName")["value"], "desktop"); + assert_eq!(of("machineName")["editable"], true); + assert_eq!(of("machineName")["overridden"], true, "a flag or env overrides the file"); + assert_eq!(of("nodePath")["editable"], false, "a path stays read-only"); + assert_eq!(of("nodePath")["overridden"], false); + assert_eq!(of("direct.listen")["value"], "0.0.0.0:7447"); + // A secret is shown as set/not set, and never carries its value. + let token = of("relayRegisterToken"); + assert_eq!(token["secret"], true); + assert_eq!(token["editable"], true); + assert_eq!(token["set"], true); + assert!(token.get("value").is_none()); + assert_eq!(of("blossomRegisterToken")["set"], false); + assert!(!serde_json::to_string(&fields).unwrap().contains("s3cret"), "no secret value is in the view"); + } } diff --git a/crates/bridge-runtime/src/direct.rs b/crates/bridge-runtime/src/direct.rs index 3940883f..ec57e700 100644 --- a/crates/bridge-runtime/src/direct.rs +++ b/crates/bridge-runtime/src/direct.rs @@ -269,18 +269,20 @@ impl Hub { } /// Start the listeners `config` asks for; `None` when it asks for none. +/// `web_config` is what the page's config API reads and writes. pub async fn start( config: &DirectConfig, home: &Path, bridge_pubkey: String, inputs: mpsc::UnboundedSender, + web_config: crate::web::ConfigView, ) -> Result, String> { if !config.enabled() { log::info!("[Direct] Off (no direct listener configured)"); return Ok(None); } let npub = protocol::crypto::npub_from_hex(&bridge_pubkey).unwrap_or_else(|_| bridge_pubkey.clone()); - let web = crate::web::Web::new(npub, &config.endpoints, inputs.clone()); + let web = crate::web::Web::new(npub, &config.endpoints, inputs.clone(), home, web_config); let hub = Hub::new(bridge_pubkey, inputs); let mut tasks = Vec::new(); let mut bound_wss = None; diff --git a/crates/bridge-runtime/src/runtime.rs b/crates/bridge-runtime/src/runtime.rs index e90c3c36..334837dd 100644 --- a/crates/bridge-runtime/src/runtime.rs +++ b/crates/bridge-runtime/src/runtime.rs @@ -166,7 +166,8 @@ pub async fn run(config: Config, state: StateFile, keys: Keypair, options: Optio }; let (inputs, mut rx) = mpsc::unbounded_channel(); - let direct = crate::direct::start(&config.direct, &config.home, keys.pubkey_hex.clone(), inputs.clone()).await?; + let web_config = crate::web::ConfigView { path: config.config_file.clone(), fields: crate::config::web_config_fields(&config) }; + let direct = crate::direct::start(&config.direct, &config.home, keys.pubkey_hex.clone(), inputs.clone(), web_config).await?; engine_config.direct = direct.as_ref().map(|d| d.info.clone()); let relays = Relays::start( config.relays.clone(), @@ -348,6 +349,10 @@ impl Runtime { Effect::Publish { to, message } => { if let (protocol::events::BridgeToPhone::Sessions(list), Some(direct)) = (&message, &self.direct) { direct.web.set_heartbeat(list); + // The devices API follows the heartbeat: the paired + // phones are cheap to hand over, and this is where they + // change. + direct.web.set_devices(self.engine.paired_phones()); } self.relays.publish(to, message) } @@ -374,6 +379,9 @@ impl Runtime { let filter = self.engine.commands_filter(); if let Some(direct) = &self.direct { direct.hub.set_paired(&filter.authors); + // Pairing changed (this effect rebuilds the command + // subscription): keep the devices API in step at once. + direct.web.set_devices(self.engine.paired_phones()); } self.relays.subscribe_commands(filter.authors, filter.since, self.terminals_on_relays); } diff --git a/crates/bridge-runtime/src/web.rs b/crates/bridge-runtime/src/web.rs index 671b0899..9c9c7483 100644 --- a/crates/bridge-runtime/src/web.rs +++ b/crates/bridge-runtime/src/web.rs @@ -14,8 +14,17 @@ //! a signed command, which the engine matches (`engine::web`). Until then the //! browser sees only the sign-in page. The session lives in a cookie the //! server alone can read, and only HTTPS carries it (`__Host-`, `Secure`, -//! `HttpOnly`, `SameSite=Strict`); it lapses after 30 days, and a restart -//! ends it, since signed-in browsers are kept in memory only. +//! `HttpOnly`, `SameSite=Strict`); it lapses after 30 days. Signed-in +//! browsers survive a restart — they are kept in `/web-sessions.json`, +//! keyed by the SHA-256 of the cookie's value so the file holds no token a +//! copy could be replayed from — and signing out or revoking ends one. +//! +//! Signed in, the page can also read and change a little: `GET /api/browsers` +//! lists the signed-in browsers and `POST /api/browsers/sign-out` ends one; +//! `GET /api/devices` shows the paired identities and their clients; +//! `GET /api/config` shows the config as it is in effect and +//! `POST /api/config` changes the safe set of keys (never a path or a +//! listener, and a secret only as set/not set). //! //! Hardening, since a LAN or VPN is not a trusted place: //! - the `Host` must be an IP address, `localhost`, or a host the direct @@ -30,15 +39,17 @@ //! The page never shows a secret: what it reads is the heartbeat, which by //! protocol carries credential status and never a credential. -use std::cell::RefCell; +use std::cell::{Cell, RefCell}; use std::collections::HashMap; use std::net::IpAddr; +use std::path::{Path, PathBuf}; use std::rc::Rc; use std::time::Duration; use base64::Engine as _; -use bridge_core::Input; +use bridge_core::{Input, PairedPhone}; use protocol::events::SessionListMsg; +use serde_json::Value; use sha2::{Digest, Sha256}; use tokio::io::{AsyncRead, AsyncReadExt, AsyncWrite, AsyncWriteExt}; use tokio::sync::mpsc; @@ -53,6 +64,9 @@ const BODY_TIMEOUT: Duration = Duration::from_secs(10); pub const PENDING_TTL_MS: u64 = 5 * 60 * 1000; /// How long a signed-in browser stays signed in. const SESSION_TTL_MS: u64 = 30 * 24 * 3600 * 1000; +/// How often a signed-in browser's `lastSeenMs` is written to disk at most; +/// a request touches it in memory every time, but the file no more often. +const LAST_SEEN_WRITE_MS: u64 = 60 * 1000; /// Pending sign-ins kept at once; the oldest goes first past it. The /// engine keeps as many codes, and is told of every one dropped here, so a /// phone is never told it let in a browser this page no longer knows. @@ -70,6 +84,11 @@ const COOKIE: &str = "__Host-codedeck"; /// The characters a sign-in code is drawn from: no 0/O, 1/I/L, so it can be /// read off a screen and typed on a phone without doubt. const CODE_ALPHABET: &[u8] = b"23456789ABCDEFGHJKMNPQRSTUVWXYZ"; +/// How many hex characters of a browser's key are its public id. +const ID_LEN: usize = 16; +/// Longest `User-Agent` kept for a browser; the header is the client's, so it +/// is bounded before it is stored or shown. +const AGENT_MAX_CHARS: usize = 120; const INDEX_HTML: &str = include_str!("../web/index.html"); const APP_JS: &str = include_str!("../web/app.js"); @@ -95,6 +114,58 @@ struct Browser { /// When it got where it stands, as a count: what the caps drop the /// lowest of (a clock can give two browsers the same millisecond). order: u64, + /// The `User-Agent` of the request that started the sign-in, cleaned + /// (control characters stripped, at most [`AGENT_MAX_CHARS`]). Shown on + /// the page so the owner can tell one browser from another. + agent: String, + /// When it last made an authenticated request. Kept in memory on every + /// one, written at most every [`LAST_SEEN_WRITE_MS`]. + last_seen_ms: u64, +} + +/// What the page's config API needs: where `config.json` lives, and the view +/// of the config as it is in effect (flags and environment already applied). +#[derive(Clone, Default)] +pub struct ConfigView { + pub path: PathBuf, + pub fields: Vec, +} + +/// One signed-in browser as it is kept on disk. Never a token: the `key` is +/// already the token's SHA-256, so a copy of this file cannot be replayed as +/// a cookie. +#[derive(serde::Serialize, serde::Deserialize)] +#[serde(rename_all = "camelCase")] +struct StoredSession { + key: String, + by: String, + since_ms: u64, + expires_ms: u64, + last_seen_ms: u64, + peer: String, + agent: String, +} + +/// A paired phone as the devices API shows it: the identity, its label and +/// each client's key expiry. Never a secret — a session key's public half is +/// not shown either, since only its lapse matters to the page. +#[derive(Debug, Clone, serde::Serialize)] +#[serde(rename_all = "camelCase")] +pub struct DeviceView { + pub npub: String, + pub label: String, + pub paired_at: String, + pub clients: Vec, +} + +/// One client of a paired identity. +#[derive(Debug, Clone, serde::Serialize)] +#[serde(rename_all = "camelCase")] +pub struct ClientView { + /// When the client's session key lapses (seconds since the Unix epoch). + pub expires_at: u64, + /// Until when (ms) the client counts as present. + pub present_until_ms: u64, } /// The page's state: the latest heartbeat and the browsers it knows. @@ -110,16 +181,32 @@ pub struct Web { /// Sign-in starts in the current minute, by [`rate_key`]. starts: RefCell>, /// The next [`Browser::order`]. - order: std::cell::Cell, + order: Cell, inputs: mpsc::UnboundedSender, /// Sign-in switched off for development (`CODEDECK_WEB_NO_SIGN_IN=1`): /// a browser on a loopback or private address is let in without a /// phone. Never on by default, logged loudly, and shown on the page. no_sign_in: bool, + /// Where the signed-in browsers are kept between restarts. + sessions_path: PathBuf, + /// The config file the config API writes. + config_file: PathBuf, + /// The config as it is in effect, for the config API to show. + config_fields: RefCell>, + /// The paired identities, refreshed whenever the heartbeat is. + devices: RefCell>, + /// When `lastSeenMs` was last written to disk. + last_persist_ms: Cell, } impl Web { - pub fn new(machine_npub: String, endpoints: &[String], inputs: mpsc::UnboundedSender) -> Rc { + pub fn new( + machine_npub: String, + endpoints: &[String], + inputs: mpsc::UnboundedSender, + home: &Path, + config: ConfigView, + ) -> Rc { let hosts = endpoints.iter().filter_map(|url| endpoint_host(url)).collect(); let no_sign_in = std::env::var("CODEDECK_WEB_NO_SIGN_IN").is_ok_and(|v| v == "1"); if no_sign_in { @@ -128,15 +215,26 @@ impl Web { address sees this bridge's page without a phone. For development only." ); } + let sessions_path = home.join("web-sessions.json"); + let browsers = load_sessions(&sessions_path); + let order = browsers.values().map(|b| b.order).max().unwrap_or(0) + 1; + if !browsers.is_empty() { + log::info!("[Web] {} signed-in browser(s) restored from {}", browsers.len(), sessions_path.display()); + } Rc::new(Self { machine_npub, hosts, heartbeat: RefCell::default(), - browsers: RefCell::default(), + browsers: RefCell::new(browsers), starts: RefCell::default(), - order: std::cell::Cell::new(1), + order: Cell::new(order), inputs, no_sign_in, + sessions_path, + config_file: config.path, + config_fields: RefCell::new(config.fields), + devices: RefCell::default(), + last_persist_ms: Cell::new(0), }) } @@ -145,40 +243,82 @@ impl Web { *self.heartbeat.borrow_mut() = Some(list.clone()); } + /// The paired identities, refreshed alongside the heartbeat: what the + /// devices API shows. Only what is not a secret goes in. + pub fn set_devices(&self, phones: &[PairedPhone]) { + let devices = phones + .iter() + .map(|phone| DeviceView { + npub: phone.npub.clone(), + label: phone.label.clone(), + paired_at: phone.paired_at.clone(), + clients: phone + .clients + .iter() + .map(|client| ClientView { expires_at: client.key.expires_at, present_until_ms: client.present_until_ms }) + .collect(), + }) + .collect(); + *self.devices.borrow_mut() = devices; + } + /// A phone of `by` sent `code`, and the engine matched it to a code this /// page showed: that browser is signed in. pub fn signed_in(&self, code: &str, by: &str) { let now = now_ms(); - for browser in self.browsers.borrow_mut().values_mut() { - if matches!(&browser.access, Access::Pending { code: c, .. } if c == code) { - log::info!("[Web] A browser at {} signed in", browser.peer); - browser.access = Access::SignedIn { by: by.to_string(), since_ms: now, expires_ms: now + SESSION_TTL_MS }; - // The session's age is from its sign-in, so the cap below - // drops the longest signed in, never the one just let in. - browser.order = self.next_order(); + { + let mut browsers = self.browsers.borrow_mut(); + for browser in browsers.values_mut() { + if matches!(&browser.access, Access::Pending { code: c, .. } if c == code) { + log::info!("[Web] A browser at {} signed in", browser.peer); + browser.access = Access::SignedIn { by: by.to_string(), since_ms: now, expires_ms: now + SESSION_TTL_MS }; + browser.last_seen_ms = now; + // The session's age is from its sign-in, so the cap below + // drops the longest signed in, never the one just let in. + browser.order = self.next_order(); + } } + evict_oldest(&mut browsers, MAX_SESSIONS, |b| matches!(b.access, Access::SignedIn { .. })); } - let mut browsers = self.browsers.borrow_mut(); - evict_oldest(&mut browsers, MAX_SESSIONS, |b| matches!(b.access, Access::SignedIn { .. })); + self.persist(); } fn browser(&self, token: Option<&str>) -> Option<(String, Browser)> { let key = token_key(token?); let now = now_ms(); - let mut browsers = self.browsers.borrow_mut(); - let expired = match browsers.get(&key)?.access { - Access::Pending { expires_ms, .. } | Access::SignedIn { expires_ms, .. } => expires_ms <= now, - }; + let mut expired = false; + let mut touched = false; + { + let mut browsers = self.browsers.borrow_mut(); + let browser = browsers.get_mut(&key)?; + let expires_ms = match browser.access { + Access::Pending { expires_ms, .. } | Access::SignedIn { expires_ms, .. } => expires_ms, + }; + if expires_ms <= now { + expired = true; + } else if matches!(browser.access, Access::SignedIn { .. }) { + // An authenticated request: its `lastSeenMs` moves, and the + // file follows at most once a minute. + browser.last_seen_ms = now; + touched = true; + } + } if expired { - browsers.remove(&key); + self.browsers.borrow_mut().remove(&key); + self.persist(); return None; } - browsers.get(&key).map(|b| (key, b.clone())) + if touched && now.saturating_sub(self.last_persist_ms.get()) >= LAST_SEEN_WRITE_MS { + self.last_persist_ms.set(now); + self.persist(); + } + self.browsers.borrow().get(&key).map(|b| (key.clone(), b.clone())) } - /// Start a sign-in for a browser at `peer`: a new code, and the cookie - /// that names it. `None` when the address started too many lately. - fn start_sign_in(&self, peer: IpAddr) -> Option<(String, String)> { + /// Start a sign-in for a browser at `peer` (its `User-Agent` is `agent`): + /// a new code, and the cookie that names it. `None` when the address + /// started too many lately. + fn start_sign_in(&self, peer: IpAddr, agent: &str) -> Option<(String, String)> { let now = now_ms(); { let mut starts = self.starts.borrow_mut(); @@ -201,8 +341,17 @@ impl Web { browsers.retain(|_, b| match b.access { Access::Pending { expires_ms, .. } | Access::SignedIn { expires_ms, .. } => expires_ms > now, }); - browsers.insert(token_key(&token), Browser { access: Access::Pending { code: code.clone(), expires_ms }, peer, order: self.next_order() }); + let browser = Browser { + access: Access::Pending { code: code.clone(), expires_ms }, + peer, + order: self.next_order(), + agent: agent.to_string(), + last_seen_ms: now, + }; + browsers.insert(token_key(&token), browser); let _ = self.inputs.send(Input::WebSignInPending { code: code.clone(), expires_ms }); + // Pending browsers are not written to disk, so a dropped one needs no + // persist — but the file may have lost an expired signed-in one above. for dropped in evict_oldest(&mut browsers, MAX_PENDING, |b| matches!(b.access, Access::Pending { .. })) { self.withdraw(&dropped); } @@ -213,6 +362,29 @@ impl Web { let removed = self.browsers.borrow_mut().remove(key); if let Some(browser) = removed { self.withdraw(&browser); + self.persist(); + } + } + + /// Sign out the browser whose id (the first [`ID_LEN`] hex characters of + /// its key) is `id`; false when no signed-in browser has it. Any + /// signed-in browser may sign out any other: they are all the owner's. + fn revoke(&self, id: &str) -> bool { + if id.len() != ID_LEN { + return false; + } + let key = self + .browsers + .borrow() + .iter() + .find(|(key, browser)| key.starts_with(id) && matches!(browser.access, Access::SignedIn { .. })) + .map(|(key, _)| key.clone()); + match key { + Some(key) => { + self.sign_out(&key); + true + } + None => false, } } @@ -222,6 +394,34 @@ impl Web { order } + /// Write the signed-in browsers to disk, owner-only and atomically. A + /// pending one is not written (its code is short-lived and useless after + /// a restart), and no token ever is — only the key's SHA-256. + fn persist(&self) { + let mut sessions: Vec = self + .browsers + .borrow() + .iter() + .filter_map(|(key, browser)| match &browser.access { + Access::SignedIn { by, since_ms, expires_ms } => Some(StoredSession { + key: key.clone(), + by: by.clone(), + since_ms: *since_ms, + expires_ms: *expires_ms, + last_seen_ms: browser.last_seen_ms, + peer: browser.peer.to_string(), + agent: browser.agent.clone(), + }), + Access::Pending { .. } => None, + }) + .collect(); + sessions.sort_by(|a, b| a.since_ms.cmp(&b.since_ms).then_with(|| a.key.cmp(&b.key))); + let Ok(json) = serde_json::to_vec_pretty(&sessions) else { return }; + if let Err(e) = crate::state::write_private(&self.sessions_path, &json) { + log::warn!("[Web] cannot write {}: {e}", self.sessions_path.display()); + } + } + /// The page stopped showing a pending browser's code: the engine must not /// let a phone use it. fn withdraw(&self, browser: &Browser) { @@ -241,6 +441,138 @@ impl Web { }) .to_string() } + + /// The signed-in browsers, oldest first, for `GET /api/browsers`. + fn browsers_json(&self, current: Option<&str>) -> String { + let mut rows: Vec<(u64, Value)> = self + .browsers + .borrow() + .iter() + .filter_map(|(key, browser)| match &browser.access { + Access::SignedIn { by, since_ms, expires_ms } => Some(( + browser.order, + serde_json::json!({ + "id": &key[..ID_LEN], + "by": by, + "sinceMs": since_ms, + "lastSeenMs": browser.last_seen_ms, + "expiresMs": expires_ms, + "peer": browser.peer.to_string(), + "agent": browser.agent, + "current": current == Some(key.as_str()), + }), + )), + Access::Pending { .. } => None, + }) + .collect(); + rows.sort_by_key(|(order, _)| *order); + serde_json::json!({ "browsers": rows.into_iter().map(|(_, row)| row).collect::>() }).to_string() + } + + /// The paired identities, for `GET /api/devices`. + fn devices_json(&self) -> String { + serde_json::json!({ "devices": self.devices.borrow().clone() }).to_string() + } + + /// The config as it is in effect, for `GET /api/config`. + fn config_json(&self) -> String { + serde_json::json!({ "fields": self.config_fields.borrow().clone() }).to_string() + } + + /// Apply a `POST /api/config` body: only safe-set keys, each validated, + /// then written to the config file keeping every other key. `by` is the + /// approver's npub, for the log line (key names only, never a value). + fn apply_config(&self, body: &[u8], by: &str) -> Response { + let Ok(doc) = serde_json::from_slice::(body) else { return Response::error(400) }; + let Some(obj) = doc.as_object() else { return Response::error(400) }; + if obj.keys().any(|key| key != "set" && key != "secrets") { + return Response::error(400); + } + let empty = serde_json::Map::new(); + let set = match obj.get("set") { + None => &empty, + Some(Value::Object(map)) => map, + Some(_) => return Response::error(400), + }; + let secrets = match obj.get("secrets") { + None => &empty, + Some(Value::Object(map)) => map, + Some(_) => return Response::error(400), + }; + let mut changes: Vec<(String, Option)> = Vec::new(); + for (key, value) in set { + if !crate::config::WEB_EDITABLE.contains(&key.as_str()) { + return bad_request(key, "not a setting the page may change"); + } + if let Err(message) = crate::config::validate_web_value(key, value) { + return bad_request(key, &message); + } + changes.push((key.clone(), Some(value.clone()))); + } + for (key, value) in secrets { + if !crate::config::WEB_EDITABLE_SECRETS.contains(&key.as_str()) { + return bad_request(key, "not a secret the page may change"); + } + if let Err(message) = crate::config::validate_web_secret(key, value) { + return bad_request(key, &message); + } + // `null` clears the token: the key comes out of the file. + changes.push((key.clone(), (!value.is_null()).then(|| value.clone()))); + } + if changes.is_empty() { + return bad_request("", "nothing to change"); + } + match crate::config::write_web_settings(&self.config_file, &changes) { + Ok(()) => { + let keys: Vec<&str> = changes.iter().map(|(key, _)| key.as_str()).collect(); + log::info!("[Web] config changed by {}: keys {}", &by[..8.min(by.len())], keys.join(", ")); + Response::json(200, serde_json::json!({ "ok": true, "restartNeeded": true }).to_string()) + } + Err(err) => { + log::warn!("[Web] config write failed: {err}"); + Response::error(500) + } + } + } +} + +/// The signed-in browsers a previous run left in `path`, expired ones +/// dropped. A missing or unreadable file is an empty set, with a warning: a +/// page that will not start is worse than one whose browsers sign in again. +fn load_sessions(path: &Path) -> HashMap { + let now = now_ms(); + let raw = match std::fs::read_to_string(path) { + Ok(raw) => raw, + Err(e) if e.kind() == std::io::ErrorKind::NotFound => return HashMap::new(), + Err(e) => { + log::warn!("[Web] cannot read {}: {e}; starting with no signed-in browsers", path.display()); + return HashMap::new(); + } + }; + let stored: Vec = match serde_json::from_str(&raw) { + Ok(stored) => stored, + Err(e) => { + log::warn!("[Web] ignoring {}: {e}; starting with no signed-in browsers", path.display()); + return HashMap::new(); + } + }; + let mut browsers = HashMap::new(); + let mut order = 1; + for session in stored { + // A key is always 64 hex characters; anything else is not one this + // page wrote, so it is dropped rather than trusted. + let Ok(peer) = session.peer.parse::() else { continue }; + if session.expires_ms <= now || session.key.len() != 64 { + continue; + } + let access = Access::SignedIn { by: session.by, since_ms: session.since_ms, expires_ms: session.expires_ms }; + browsers.insert( + session.key, + Browser { access, peer, order, agent: session.agent, last_seen_ms: session.last_seen_ms }, + ); + order += 1; + } + browsers } /// Drop the oldest browsers matching `which` until at most `cap` of them are @@ -317,6 +649,9 @@ struct Request { host: Option, origin: Option, cookie: Option, + user_agent: Option, + /// The body, read off whole and bounded (empty for a request without one). + body: Vec, } /// Parse the request whose head is in `buf` (with whatever of its body came @@ -338,12 +673,14 @@ async fn read_request(buf: &[u8], stream: &mut S) -> Resul if length > MAX_BODY_BYTES || header("transfer-encoding").is_some() { return Err(413); } - // No route reads a body yet (a POST says what it does by its path), but - // one that came is read off whole, bounded, so the request ends cleanly. - let arrived = buf.len() - head; + // The body is read off whole and bounded, so the request ends cleanly + // even for a route that does not look at it. + let arrived = (buf.len() - head).min(length); + let mut body = buf[head..head + arrived].to_vec(); if arrived < length { let mut rest = vec![0u8; length - arrived]; tokio::time::timeout(BODY_TIMEOUT, stream.read_exact(&mut rest)).await.map_err(|_| 408u16)?.map_err(|_| 400u16)?; + body.extend_from_slice(&rest); } let cookie = header("cookie").and_then(|all| { all.split(';').find_map(|pair| pair.trim().strip_prefix(&format!("{COOKIE}=")).map(str::to_string)) @@ -354,9 +691,17 @@ async fn read_request(buf: &[u8], stream: &mut S) -> Resul host: header("host"), origin: header("origin"), cookie, + user_agent: header("user-agent"), + body, }) } +/// A request's `User-Agent`, safe to store and show: control characters (a +/// newline above all) removed, at most [`AGENT_MAX_CHARS`] characters. +fn clean_agent(raw: Option<&str>) -> String { + raw.unwrap_or("").chars().filter(|c| !c.is_control()).take(AGENT_MAX_CHARS).collect() +} + /// Whether `host` (a `Host` header: name and optional port) may be served. fn host_allowed(host: &str, hosts: &[String]) -> bool { let name = if let Some(v6) = host.strip_prefix('[') { @@ -401,6 +746,7 @@ fn reason(status: u16) -> &'static str { 408 => "Request Timeout", 413 => "Payload Too Large", 429 => "Too Many Requests", + 500 => "Internal Server Error", _ => "Error", } } @@ -497,7 +843,8 @@ fn route(request: &Request, peer: IpAddr, web: &Web) -> Response { return Response::error(403); } let browser = if web.no_sign_in && is_local(peer) { - Some((String::new(), Browser { access: Access::SignedIn { by: "sign-in switched off".into(), since_ms: 0, expires_ms: u64::MAX }, peer, order: 0 })) + let access = Access::SignedIn { by: "sign-in switched off".into(), since_ms: 0, expires_ms: u64::MAX }; + Some((String::new(), Browser { access, peer, order: 0, agent: String::new(), last_seen_ms: 0 })) } else { web.browser(request.cookie.as_deref()) }; @@ -506,7 +853,7 @@ fn route(request: &Request, peer: IpAddr, web: &Web) -> Response { ("GET", "/app.js") => Response::new(200, "text/javascript; charset=utf-8", APP_JS), ("GET", "/app.css") => Response::new(200, "text/css; charset=utf-8", APP_CSS), ("GET", "/api/me") => Response::json(200, me_json(browser.as_ref().map(|(_, b)| b))), - ("POST", "/api/sign-in") => match web.start_sign_in(peer) { + ("POST", "/api/sign-in") => match web.start_sign_in(peer, &clean_agent(request.user_agent.as_deref())) { Some((token, code)) => { let mut response = Response::json(200, serde_json::json!({ "state": "pending", "code": code, "expiresInMs": PENDING_TTL_MS }).to_string()); response.set_cookie = Some(session_cookie(&token, SESSION_TTL_MS / 1000)); @@ -532,17 +879,63 @@ fn route(request: &Request, peer: IpAddr, web: &Web) -> Response { response.set_cookie = Some(session_cookie("", 0)); response } - ("GET", "/api/status") => match browser { - Some((_, Browser { access: Access::SignedIn { by, since_ms, .. }, .. })) => Response::json(200, web.status_json(&by, since_ms)), + ("GET", "/api/status") => match &browser { + Some((_, Browser { access: Access::SignedIn { by, since_ms, .. }, .. })) => Response::json(200, web.status_json(by, *since_ms)), _ => Response::error(401), }, - (_, "/" | "/app.js" | "/app.css" | "/api/me" | "/api/sign-in" | "/api/sign-in/qr.svg" | "/api/sign-out" | "/api/status") => { - Response::error(405) - } + ("GET", "/api/browsers") => match signed_in(&browser) { + Some((key, _)) => Response::json(200, web.browsers_json(Some(key))), + None => Response::error(401), + }, + ("POST", "/api/browsers/sign-out") => match signed_in(&browser) { + Some(_) => match sign_out_id(&request.body) { + Some(id) if web.revoke(&id) => Response::json(200, serde_json::json!({ "ok": true }).to_string()), + Some(_) => Response::error(404), + None => Response::error(400), + }, + None => Response::error(401), + }, + ("GET", "/api/devices") => match signed_in(&browser) { + Some(_) => Response::json(200, web.devices_json()), + None => Response::error(401), + }, + ("GET", "/api/config") => match signed_in(&browser) { + Some(_) => Response::json(200, web.config_json()), + None => Response::error(401), + }, + ("POST", "/api/config") => match signed_in(&browser) { + Some((_, by)) => web.apply_config(&request.body, by), + None => Response::error(401), + }, + ( + _, + "/" | "/app.js" | "/app.css" | "/api/me" | "/api/sign-in" | "/api/sign-in/qr.svg" | "/api/sign-out" | "/api/status" + | "/api/browsers" | "/api/browsers/sign-out" | "/api/devices" | "/api/config", + ) => Response::error(405), _ => Response::error(404), } } +/// The signed-in browser's key and approver, if it is signed in. +fn signed_in(browser: &Option<(String, Browser)>) -> Option<(&str, &str)> { + match browser { + Some((key, Browser { access: Access::SignedIn { by, .. }, .. })) => Some((key.as_str(), by.as_str())), + _ => None, + } +} + +/// The browser id a sign-out POST names, or `None` when the body is not a +/// JSON object with a string `id`. +fn sign_out_id(body: &[u8]) -> Option { + let doc: Value = serde_json::from_slice(body).ok()?; + doc.get("id")?.as_str().map(str::to_string) +} + +/// A 400 naming the setting at fault, so the page can point at it. +fn bad_request(key: &str, message: &str) -> Response { + Response::json(400, serde_json::json!({ "error": message, "key": key }).to_string()) +} + /// Loopback, a private network (RFC 1918, unique-local IPv6) or link-local: /// where the development switch lets a browser in without a phone. fn is_local(ip: IpAddr) -> bool { @@ -573,9 +966,32 @@ fn me_json(browser: Option<&Browser>) -> String { mod tests { use super::*; - fn web() -> (Rc, mpsc::UnboundedReceiver) { + /// A page over `home`, with no config view. + fn web_in(home: &Path) -> (Rc, mpsc::UnboundedReceiver) { + web_with_config(home, Vec::new()) + } + + /// A page over `home`, its config API showing `fields`. + fn web_with_config(home: &Path, fields: Vec) -> (Rc, mpsc::UnboundedReceiver) { let (tx, rx) = mpsc::unbounded_channel(); - (Web::new("npub1machine".into(), &["wss://box.tail1234.ts.net:7447".into()], tx), rx) + let config = ConfigView { path: home.join("config.json"), fields }; + (Web::new("npub1machine".into(), &["wss://box.tail1234.ts.net:7447".into()], tx, home, config), rx) + } + + /// A page over a fresh temp dir, which the caller must keep alive. + fn web() -> (Rc, mpsc::UnboundedReceiver, tempfile::TempDir) { + let dir = tempfile::tempdir().unwrap(); + let (web, rx) = web_in(dir.path()); + (web, rx, dir) + } + + /// Start a sign-in at [`PEER`] and have the owner approve it, returning + /// the browser's cookie token. + fn sign_in(web: &Web, inputs: &mut mpsc::UnboundedReceiver) -> String { + let (token, _) = web.start_sign_in(PEER, "Mozilla/5.0").expect("a start"); + let Some(Input::WebSignInPending { code, .. }) = inputs.try_recv().ok() else { panic!("the engine is told the code") }; + web.signed_in(&code, "npub1owner"); + token } fn request(method: &str, path: &str, host: &str) -> Request { @@ -585,10 +1001,13 @@ mod tests { host: Some(host.into()), origin: (method == "POST").then(|| format!("https://{host}")), cookie: None, + user_agent: None, + body: Vec::new(), } } const PEER: IpAddr = IpAddr::V4(std::net::Ipv4Addr::new(192, 168, 1, 20)); + const HOST: &str = "192.168.1.5:7447"; #[test] fn only_addresses_localhost_and_the_endpoints_hosts_are_served() { @@ -603,7 +1022,7 @@ mod tests { #[test] fn a_post_from_another_origin_is_refused() { - let (web, _) = web(); + let (web, _, _dir) = web(); let mut post = request("POST", "/api/sign-in", "192.168.1.5:7447"); post.origin = Some("https://evil.example".into()); assert_eq!(route(&post, PEER, &web).status, 403); @@ -613,7 +1032,7 @@ mod tests { #[test] fn the_status_needs_a_signed_in_browser() { - let (web, mut inputs) = web(); + let (web, mut inputs, _dir) = web(); let host = "192.168.1.5:7447"; assert_eq!(route(&request("GET", "/api/status", host), PEER, &web).status, 401); @@ -638,25 +1057,25 @@ mod tests { #[test] fn an_ipv6_host_is_rate_limited_by_its_slash_64() { - let (web, _) = web(); + let (web, _, _dir) = web(); for i in 0..STARTS_PER_MINUTE { let peer = IpAddr::V6(std::net::Ipv6Addr::new(0x2001, 0xdb8, 1, 2, 0, 0, 0, i as u16 + 1)); - assert!(web.start_sign_in(peer).is_some()); + assert!(web.start_sign_in(peer, "").is_some()); } let same_64 = IpAddr::V6(std::net::Ipv6Addr::new(0x2001, 0xdb8, 1, 2, 9, 9, 9, 9)); - assert!(web.start_sign_in(same_64).is_none(), "another address in the same /64 counts as the same host"); + assert!(web.start_sign_in(same_64, "").is_none(), "another address in the same /64 counts as the same host"); let other_64 = IpAddr::V6(std::net::Ipv6Addr::new(0x2001, 0xdb8, 1, 3, 0, 0, 0, 1)); - assert!(web.start_sign_in(other_64).is_some()); + assert!(web.start_sign_in(other_64, "").is_some()); } #[test] fn a_pending_browser_dropped_or_signed_out_withdraws_its_code() { - let (web, mut inputs) = web(); + let (web, mut inputs, _dir) = web(); let mut first = None; for i in 0..=MAX_PENDING { // A peer of its own each, so the rate limit does not interfere. let peer = IpAddr::V4(std::net::Ipv4Addr::new(10, 0, (i / 250) as u8, (i % 250) as u8 + 1)); - let (token, code) = web.start_sign_in(peer).expect("a start"); + let (token, code) = web.start_sign_in(peer, "").expect("a start"); first.get_or_insert((token, code)); } let (first_token, first_code) = first.unwrap(); @@ -669,7 +1088,7 @@ mod tests { assert_eq!(withdrawn, vec![first_code], "the oldest pending browser made room, and its code went with it"); assert!(web.browser(Some(&first_token)).is_none()); - let (token, code) = web.start_sign_in(IpAddr::V4(std::net::Ipv4Addr::new(10, 9, 9, 9))).unwrap(); + let (token, code) = web.start_sign_in(IpAddr::V4(std::net::Ipv4Addr::new(10, 9, 9, 9)), "").unwrap(); while inputs.try_recv().is_ok() {} web.sign_out(&token_key(&token)); assert!(matches!(inputs.try_recv(), Ok(Input::WebSignInWithdrawn { code: c }) if c == code)); @@ -677,11 +1096,11 @@ mod tests { #[test] fn signed_in_browsers_are_capped_by_the_longest_signed_in() { - let (web, _) = web(); + let (web, _, _dir) = web(); let mut tokens = Vec::new(); for i in 0..=MAX_SESSIONS { let peer = IpAddr::V4(std::net::Ipv4Addr::new(10, 1, (i / 250) as u8, (i % 250) as u8 + 1)); - let (token, code) = web.start_sign_in(peer).unwrap(); + let (token, code) = web.start_sign_in(peer, "").unwrap(); web.signed_in(&code, "npub1owner"); tokens.push(token); } @@ -693,19 +1112,19 @@ mod tests { #[test] fn sign_in_starts_are_rate_limited_per_address() { - let (web, _) = web(); + let (web, _, _dir) = web(); for _ in 0..STARTS_PER_MINUTE { - assert!(web.start_sign_in(PEER).is_some()); + assert!(web.start_sign_in(PEER, "").is_some()); } - assert!(web.start_sign_in(PEER).is_none()); - assert!(web.start_sign_in(IpAddr::V4(std::net::Ipv4Addr::new(192, 168, 1, 21))).is_some()); + assert!(web.start_sign_in(PEER, "").is_none()); + assert!(web.start_sign_in(IpAddr::V4(std::net::Ipv4Addr::new(192, 168, 1, 21)), "").is_some()); } #[test] fn pending_sign_ins_are_capped() { - let (web, _) = web(); + let (web, _, _dir) = web(); for i in 0..(MAX_PENDING as u8 + 10) { - web.start_sign_in(IpAddr::V4(std::net::Ipv4Addr::new(10, 0, 0, i))).unwrap(); + web.start_sign_in(IpAddr::V4(std::net::Ipv4Addr::new(10, 0, 0, i)), "").unwrap(); } assert!(web.browsers.borrow().len() <= MAX_PENDING); } @@ -723,4 +1142,242 @@ mod tests { assert!(!is_websocket(b"GET / HTTP/1.1\r\nHost: x\r\n\r\n")); assert_eq!(head_len(b"GET / HTTP/1.1\r\n\r\nbody"), Some(18)); } + + #[test] + fn signed_in_browsers_survive_a_restart() { + let dir = tempfile::tempdir().unwrap(); + let (web, mut inputs) = web_in(dir.path()); + let token = sign_in(&web, &mut inputs); + + // A new page over the same home, as after a restart. + let (again, _rx) = web_in(dir.path()); + let mut status = request("GET", "/api/status", HOST); + status.cookie = Some(token.clone()); + assert_eq!(route(&status, PEER, &again).status, 200, "the cookie still works"); + + // The file holds the key's SHA-256, never the token itself. + let raw = std::fs::read_to_string(dir.path().join("web-sessions.json")).unwrap(); + assert!(!raw.contains(&token), "no token is written"); + assert!(raw.contains(&token_key(&token)), "the key's hash is"); + assert!(raw.contains("Mozilla/5.0"), "and the User-Agent came along"); + } + + #[test] + fn an_expired_or_corrupt_sessions_file_starts_empty() { + let dir = tempfile::tempdir().unwrap(); + let path = dir.path().join("web-sessions.json"); + let expired = serde_json::json!([{ + "key": "a".repeat(64), "by": "npub1x", "sinceMs": 1, "expiresMs": 2, "lastSeenMs": 1, + "peer": "192.168.1.5", "agent": "x", + }]); + std::fs::write(&path, expired.to_string()).unwrap(); + assert!(web_in(dir.path()).0.browsers.borrow().is_empty(), "an expired one is dropped"); + + std::fs::write(&path, "{not json").unwrap(); + assert!(web_in(dir.path()).0.browsers.borrow().is_empty(), "a corrupt file is empty, not fatal"); + } + + #[test] + fn the_browsers_api_lists_browsers_and_marks_the_current_one() { + let (web, mut inputs, _dir) = web(); + let first = sign_in(&web, &mut inputs); + let (second, _) = web.start_sign_in(PEER, "curl/8").unwrap(); + let Some(Input::WebSignInPending { code, .. }) = inputs.try_recv().ok() else { panic!("the engine is told the code") }; + web.signed_in(&code, "npub1owner"); + + let mut get = request("GET", "/api/browsers", HOST); + get.cookie = Some(first.clone()); + let response = route(&get, PEER, &web); + assert_eq!(response.status, 200); + let body: Value = serde_json::from_slice(&response.body).unwrap(); + let rows = body["browsers"].as_array().unwrap(); + assert_eq!(rows.len(), 2); + assert_eq!(rows[0]["id"], &token_key(&first)[..ID_LEN]); + assert_eq!(rows[0]["current"], true); + assert_eq!(rows[1]["current"], false); + assert_eq!(rows[1]["agent"], "curl/8"); + assert_eq!(rows[0]["peer"], "192.168.1.20"); + for field in ["sinceMs", "lastSeenMs", "expiresMs"] { + assert!(rows[0][field].is_number(), "{field}"); + } + assert_eq!(rows[0]["by"], "npub1owner"); + assert!(serde_json::from_slice::(&response.body).unwrap().get("token").is_none()); + assert!(second.len() > ID_LEN, "the full token is not what the page sees"); + } + + #[test] + fn revoking_another_browser_ends_its_cookie() { + let (web, mut inputs, _dir) = web(); + let victim = sign_in(&web, &mut inputs); + let owner = sign_in(&web, &mut inputs); + + let mut status = request("GET", "/api/status", HOST); + status.cookie = Some(victim.clone()); + assert_eq!(route(&status, PEER, &web).status, 200); + + let mut post = request("POST", "/api/browsers/sign-out", HOST); + post.cookie = Some(owner); + post.body = serde_json::json!({ "id": &token_key(&victim)[..ID_LEN] }).to_string().into_bytes(); + assert_eq!(route(&post, PEER, &web).status, 200); + assert_eq!(route(&status, PEER, &web).status, 401, "the revoked browser's cookie no longer works"); + + post.body = serde_json::json!({ "id": "0123456789abcdef" }).to_string().into_bytes(); + assert_eq!(route(&post, PEER, &web).status, 404, "an unknown id"); + } + + #[test] + fn the_devices_api_shows_paired_phones_without_any_secret() { + let (web, mut inputs, _dir) = web(); + let token = sign_in(&web, &mut inputs); + let phone = bridge_core::PairedPhone { + npub: "npub1phone".into(), + pubkey_hex: "ab".repeat(32), + label: "Pixel".into(), + paired_at: "2026-01-02T03:04:05Z".into(), + clients: vec![bridge_core::PhoneClient { + key: protocol::commands::SessionKeyGrant { + pubkey_hex: "cd".repeat(32), + bridge_pubkey_hex: "ef".repeat(32), + expires_at: 1_800_000_000, + replaces: None, + label: Some("Pixel 8a".into()), + }, + previous: None, + device: "3f9a1c0e7b2d4a58".into(), + label: Some("Pixel 8a".into()), + present_until_ms: 1_700_000_000_000, + watch: bridge_core::WatchState::default(), + watch_terminal: bridge_core::WatchState::default(), + }], + }; + web.set_devices(&[phone]); + + let mut get = request("GET", "/api/devices", HOST); + get.cookie = Some(token); + let response = route(&get, PEER, &web); + assert_eq!(response.status, 200); + let body = String::from_utf8(response.body).unwrap(); + let json: Value = serde_json::from_str(&body).unwrap(); + assert_eq!(json["devices"][0]["npub"], "npub1phone"); + assert_eq!(json["devices"][0]["label"], "Pixel"); + assert_eq!(json["devices"][0]["clients"][0]["expiresAt"], 1_800_000_000u64); + assert_eq!(json["devices"][0]["clients"][0]["presentUntilMs"], 1_700_000_000_000u64); + assert!(!body.contains(&"ab".repeat(32)), "no identity key"); + assert!(!body.contains(&"cd".repeat(32)), "no session key"); + assert!(!body.contains("pubkey")); + } + + #[test] + fn the_config_api_shows_secrets_only_as_set_or_not_set() { + let dir = tempfile::tempdir().unwrap(); + let fields = vec![ + serde_json::json!({ "key": "machineName", "value": "desktop", "editable": true, "secret": false, "overridden": false }), + serde_json::json!({ "key": "relayRegisterToken", "set": true, "editable": true, "secret": true, "overridden": false }), + ]; + let (web, mut inputs) = web_with_config(dir.path(), fields); + let token = sign_in(&web, &mut inputs); + + let mut get = request("GET", "/api/config", HOST); + get.cookie = Some(token); + let response = route(&get, PEER, &web); + assert_eq!(response.status, 200); + let json: Value = serde_json::from_slice(&response.body).unwrap(); + let fields = json["fields"].as_array().unwrap(); + let secret = fields.iter().find(|f| f["key"] == "relayRegisterToken").unwrap(); + assert_eq!(secret["set"], true); + assert!(secret.get("value").is_none(), "a secret's value is never sent"); + assert!(fields.iter().any(|f| f["key"] == "machineName" && f["value"] == "desktop")); + } + + #[test] + fn a_config_post_outside_the_safe_set_is_refused_and_leaves_the_file() { + let dir = tempfile::tempdir().unwrap(); + let path = dir.path().join("config.json"); + let before = r#"{"machineName":"desktop","workspaceRoots":["/srv/w"],"keepMe":42}"#; + std::fs::write(&path, before).unwrap(); + let (web, mut inputs) = web_with_config(dir.path(), Vec::new()); + let token = sign_in(&web, &mut inputs); + + let mut post = request("POST", "/api/config", HOST); + post.cookie = Some(token); + post.body = serde_json::json!({ "set": { "nodePath": "/evil" } }).to_string().into_bytes(); + let response = route(&post, PEER, &web); + assert_eq!(response.status, 400); + assert_eq!(serde_json::from_slice::(&response.body).unwrap()["key"], "nodePath"); + assert_eq!(std::fs::read_to_string(&path).unwrap(), before, "the file is untouched"); + } + + #[test] + fn a_config_post_writes_the_file_keeping_every_other_key() { + let dir = tempfile::tempdir().unwrap(); + let path = dir.path().join("config.json"); + std::fs::write(&path, r#"{"machineName":"desktop","direct":{"listen":"0.0.0.0:7447"},"keepMe":{"x":1}}"#).unwrap(); + let (web, mut inputs) = web_with_config(dir.path(), Vec::new()); + let token = sign_in(&web, &mut inputs); + + let mut post = request("POST", "/api/config", HOST); + post.cookie = Some(token); + post.body = serde_json::json!({ + "set": { "machineName": "laptop", "relays": ["wss://relay.example"], "direct.endpoints": ["wss://192.168.1.9:7447"] }, + "secrets": { "relayRegisterToken": "tok-123" }, + }) + .to_string() + .into_bytes(); + let response = route(&post, PEER, &web); + assert_eq!(response.status, 200); + let json: Value = serde_json::from_slice(&response.body).unwrap(); + assert_eq!(json["ok"], true); + assert_eq!(json["restartNeeded"], true); + assert!(!String::from_utf8_lossy(&response.body).contains("tok-123"), "the token is never in a response"); + + let written: Value = serde_json::from_str(&std::fs::read_to_string(&path).unwrap()).unwrap(); + assert_eq!(written["machineName"], "laptop"); + assert_eq!(written["relays"][0], "wss://relay.example"); + assert_eq!(written["direct"]["endpoints"][0], "wss://192.168.1.9:7447"); + assert_eq!(written["direct"]["listen"], "0.0.0.0:7447", "another key in the same object is kept"); + assert_eq!(written["relayRegisterToken"], "tok-123"); + assert_eq!(written["keepMe"]["x"], 1, "an unknown key is kept"); + + // A null secret clears it: the key comes out of the file. + let mut clear = request("POST", "/api/config", HOST); + clear.cookie = Some(sign_in(&web, &mut inputs)); + clear.body = serde_json::json!({ "secrets": { "relayRegisterToken": null } }).to_string().into_bytes(); + assert_eq!(route(&clear, PEER, &web).status, 200); + let written: Value = serde_json::from_str(&std::fs::read_to_string(&path).unwrap()).unwrap(); + assert!(written.get("relayRegisterToken").is_none(), "cleared"); + } + + #[test] + fn a_config_post_with_a_bad_value_is_refused() { + let dir = tempfile::tempdir().unwrap(); + std::fs::write(dir.path().join("config.json"), "{}").unwrap(); + let (web, mut inputs) = web_with_config(dir.path(), Vec::new()); + let token = sign_in(&web, &mut inputs); + + for (key, value) in [ + ("machineName", serde_json::json!("")), + ("relays", serde_json::json!(["ws://192.168.1.9:7447"])), + ("direct.endpoints", serde_json::json!(["https://x"])), + ("transcriptKeepLast", serde_json::json!(-1)), + ] { + let mut post = request("POST", "/api/config", HOST); + post.cookie = Some(token.clone()); + post.body = serde_json::json!({ "set": { key: value } }).to_string().into_bytes(); + assert_eq!(route(&post, PEER, &web).status, 400, "{key}"); + } + } + + #[test] + fn every_new_api_needs_a_signed_in_browser() { + let (web, _rx, _dir) = web(); + for (method, path) in [ + ("GET", "/api/browsers"), + ("POST", "/api/browsers/sign-out"), + ("GET", "/api/devices"), + ("GET", "/api/config"), + ("POST", "/api/config"), + ] { + assert_eq!(route(&request(method, path, HOST), PEER, &web).status, 401, "{method} {path}"); + } + } } diff --git a/crates/bridge-runtime/tests/direct.rs b/crates/bridge-runtime/tests/direct.rs index a722413c..9a21a1d3 100644 --- a/crates/bridge-runtime/tests/direct.rs +++ b/crates/bridge-runtime/tests/direct.rs @@ -87,7 +87,7 @@ async fn a_paired_phone_gets_its_events_and_sends_commands_over_the_pinned_link( let (bridge, phone, stranger) = (generate_keypair(), generate_keypair(), generate_keypair()); let (inputs, mut engine) = mpsc::unbounded_channel(); let config = DirectConfig { listen: Some("127.0.0.1:0".parse().unwrap()), ..Default::default() }; - let mut link = direct::start(&config, home.path(), bridge.pubkey_hex.clone(), inputs).await.unwrap().expect("enabled"); + let mut link = direct::start(&config, home.path(), bridge.pubkey_hex.clone(), inputs, Default::default()).await.unwrap().expect("enabled"); let endpoint = link.info.endpoints[0].clone(); let pin = link.info.cert_sha256.clone().expect("a wss listener advertises its pin"); assert!(endpoint.starts_with("wss://127.0.0.1:"), "{endpoint}"); @@ -156,7 +156,7 @@ async fn a_paired_phone_sends_live_input_and_terminal_output_never_jumps_a_norma let (bridge, phone) = (generate_keypair(), generate_keypair()); let (inputs, mut engine) = mpsc::unbounded_channel(); let config = DirectConfig { listen: Some("127.0.0.1:0".parse().unwrap()), ..Default::default() }; - let mut link = direct::start(&config, home.path(), bridge.pubkey_hex.clone(), inputs).await.unwrap().unwrap(); + let mut link = direct::start(&config, home.path(), bridge.pubkey_hex.clone(), inputs, Default::default()).await.unwrap().unwrap(); let endpoint = link.info.endpoints[0].clone(); let pin = link.info.cert_sha256.clone().unwrap(); link.hub.set_paired(std::slice::from_ref(&phone.pubkey_hex)); @@ -201,7 +201,7 @@ async fn the_phone_link_talks_to_the_bridge() { let (bridge, phone) = (generate_keypair(), generate_keypair()); let (inputs, mut engine) = mpsc::unbounded_channel(); let config = DirectConfig { listen: Some("127.0.0.1:0".parse().unwrap()), ..Default::default() }; - let mut server = direct::start(&config, home.path(), bridge.pubkey_hex.clone(), inputs).await.unwrap().unwrap(); + let mut server = direct::start(&config, home.path(), bridge.pubkey_hex.clone(), inputs, Default::default()).await.unwrap().unwrap(); server.hub.set_paired(std::slice::from_ref(&phone.pubkey_hex)); let start = |pin: String| { diff --git a/docs/BRIDGE.md b/docs/BRIDGE.md index 7f22c46a..ef38c761 100644 --- a/docs/BRIDGE.md +++ b/docs/BRIDGE.md @@ -234,11 +234,25 @@ accepting it. Plain `http://` on the port redirects to A browser signs in with a paired phone: the page shows a code and a QR, and on the phone the machine's page, "Sign in a browser", scans or types it. The browser then stays signed in for 30 days (a cookie only the bridge can read, -sent only over HTTPS), until it signs out, or until the bridge restarts: the -bridge keeps signed-in browsers in memory only. Until then it sees only the -sign-in page. The page shows what the heartbeat carries — the bridge, the -direct link, the agents and their credential status, the sessions — and never -a secret. +sent only over HTTPS), and it survives a restart: signed-in browsers are kept +in `/web-sessions.json`, keyed by the cookie's SHA-256 so the file +holds no token a copy could be replayed from. Signing out, or revoking one +from the page, ends it; a pending sign-in is never written. Until signed in +it sees only the sign-in page. The page shows what the heartbeat carries — +the bridge, the direct link, the agents and their credential status, the +sessions — and never a secret. + +Signed in, the page also has a few JSON APIs: `GET /api/browsers` lists the +signed-in browsers (each with its id, approver, sign-in and last-seen times, +expiry, address and User-Agent, and which is the caller) and +`POST /api/browsers/sign-out` ends one; `GET /api/devices` shows the paired +identities and their clients (labels and key expiries, never a key); +`GET /api/config` shows the config as it is in effect (a secret only as +set/not set, and each field whether a flag or environment variable overrides +the file) and `POST /api/config` changes the safe set — the machine name, +the relays, the direct endpoints, the transcript retention and the relay / +Blossom registration tokens — validating each and rewriting `config.json` +keeping every other key. Because a LAN or VPN is not a trusted place, the page refuses a `Host` that is not an IP address, `localhost` or a host the direct endpoints name, @@ -314,6 +328,8 @@ In ``: - `bridge.lock` — held while a bridge runs, so two never share one identity; `bridge.pid` beside it names the process holding it. - `config.json` — optional; tightened to 0600 when read (it may hold admin tokens). +- `web-sessions.json` — the signed-in browsers of the web page, keyed by the + cookie's SHA-256 (never a token), 0600. Deleting it signs every browser out. - `direct/cert.der`, `direct/key.der` — the direct link's certificate and its key (0600). Deleting them makes a new one; phones pick up the new pin from the next heartbeat. From 86b57c5a3f60be6e63524a8aefd67134e0f28621 Mon Sep 17 00:00:00 2001 From: deymosh <232244450+deymosh@users.noreply.github.com> Date: Fri, 16 Oct 2026 21:21:12 +0200 Subject: [PATCH 18/30] perf(bridge): the web page never holds up the phones' links The bridge runs on one thread, shared by the relays, the engine, the phones' direct links and the web page, so anything the page does there is time every phone's traffic waits: - The browsers file is written by a thread of its own, in order, and a config write runs on the blocking pool with only its own request waiting for it: each write ends in an fsync, which a slow disk or a Docker Desktop volume can hold for tens of milliseconds. - At most 16 page requests are served at once; past that one is answered 503 rather than let it queue work in front of the phones'. - One host may hold at most 8 of the listener's 64 connections (an IPv6 host counted by its /64), so a flood of page requests, or handshakes left hanging until their timeout, cannot take the slots phones need. Co-Authored-By: Claude Code --- crates/bridge-runtime/src/direct.rs | 25 +++++ crates/bridge-runtime/src/web.rs | 142 ++++++++++++++++++++++++---- 2 files changed, 148 insertions(+), 19 deletions(-) diff --git a/crates/bridge-runtime/src/direct.rs b/crates/bridge-runtime/src/direct.rs index ec57e700..2775b113 100644 --- a/crates/bridge-runtime/src/direct.rs +++ b/crates/bridge-runtime/src/direct.rs @@ -53,6 +53,11 @@ const HELLO_TIMEOUT: Duration = Duration::from_secs(60); const IDLE_TIMEOUT: Duration = Duration::from_secs(400); /// Connections served at once, authenticated or not. const MAX_CONNECTIONS: usize = 64; +/// Connections one host holds at once (an IPv6 host by its /64). A phone +/// holds one and a browser a few; the cap keeps a single host — a flood of +/// page requests or of handshakes left hanging — from taking the slots the +/// phones need. +const MAX_CONNECTIONS_PER_HOST: usize = 8; /// Events kept for resuming, at most (besides [`OUTBOX_SECS`]). const OUTBOX_CAP: usize = 5000; /// Largest frame accepted from a phone. Commands are small; an image goes @@ -103,6 +108,8 @@ pub struct Hub { /// Published events, oldest first, with the identity each is for. outbox: RefCell>, open: Cell, + /// Connections open now by host (`web::rate_key`). + open_by_host: RefCell>, } struct Conn { @@ -177,6 +184,7 @@ impl Hub { next_id: Cell::new(0), outbox: RefCell::default(), open: Cell::new(0), + open_by_host: RefCell::default(), }) } @@ -420,6 +428,16 @@ where log::warn!("[Direct] Refusing {peer}: {MAX_CONNECTIONS} connections open"); continue; } + let host = crate::web::rate_key(peer.ip()); + { + let mut by_host = hub.open_by_host.borrow_mut(); + let held = by_host.entry(host).or_insert(0); + if *held >= MAX_CONNECTIONS_PER_HOST { + log::info!("[Direct] Refusing {peer}: {MAX_CONNECTIONS_PER_HOST} connections open from that host"); + continue; + } + *held += 1; + } hub.open.set(hub.open.get() + 1); let hub = Rc::clone(&hub); let web = web.clone(); @@ -432,6 +450,13 @@ where } } hub.open.set(hub.open.get() - 1); + let mut by_host = hub.open_by_host.borrow_mut(); + if let Some(held) = by_host.get_mut(&host) { + *held -= 1; + if *held == 0 { + by_host.remove(&host); + } + } }); } } diff --git a/crates/bridge-runtime/src/web.rs b/crates/bridge-runtime/src/web.rs index 9c9c7483..c3bdc69f 100644 --- a/crates/bridge-runtime/src/web.rs +++ b/crates/bridge-runtime/src/web.rs @@ -197,6 +197,10 @@ pub struct Web { devices: RefCell>, /// When `lastSeenMs` was last written to disk. last_persist_ms: Cell, + /// Where the browsers file is written, off the bridge's thread. + writer: Writer, + /// Page requests being served now ([`MAX_PAGE_REQUESTS`]). + serving: Cell, } impl Web { @@ -235,6 +239,8 @@ impl Web { config_fields: RefCell::new(config.fields), devices: RefCell::default(), last_persist_ms: Cell::new(0), + writer: Writer::spawn(), + serving: Cell::new(0), }) } @@ -417,9 +423,7 @@ impl Web { .collect(); sessions.sort_by(|a, b| a.since_ms.cmp(&b.since_ms).then_with(|| a.key.cmp(&b.key))); let Ok(json) = serde_json::to_vec_pretty(&sessions) else { return }; - if let Err(e) = crate::state::write_private(&self.sessions_path, &json) { - log::warn!("[Web] cannot write {}: {e}", self.sessions_path.display()); - } + self.writer.write(self.sessions_path.clone(), json); } /// The page stopped showing a pending browser's code: the engine must not @@ -522,17 +526,9 @@ impl Web { if changes.is_empty() { return bad_request("", "nothing to change"); } - match crate::config::write_web_settings(&self.config_file, &changes) { - Ok(()) => { - let keys: Vec<&str> = changes.iter().map(|(key, _)| key.as_str()).collect(); - log::info!("[Web] config changed by {}: keys {}", &by[..8.min(by.len())], keys.join(", ")); - Response::json(200, serde_json::json!({ "ok": true, "restartNeeded": true }).to_string()) - } - Err(err) => { - log::warn!("[Web] config write failed: {err}"); - Response::error(500) - } - } + let mut response = Response::json(200, serde_json::json!({ "ok": true, "restartNeeded": true }).to_string()); + response.config_write = Some(ConfigWrite { path: self.config_file.clone(), changes, by: by[..8.min(by.len())].to_string() }); + response } } @@ -589,10 +585,66 @@ fn evict_oldest(browsers: &mut HashMap, cap: usize, which: impl } } +/// Page requests served at once; past it a request is answered 503. +const MAX_PAGE_REQUESTS: usize = 16; + +/// Writes files in order on a thread of its own. The bridge runs on one +/// thread, and a write ends in an fsync that a slow disk (or a Docker +/// Desktop volume) can hold for tens of milliseconds — time every relay and +/// phone link would otherwise wait. Writes keep their order, so the file on +/// disk is always the latest one handed over. +struct Writer { + tx: std::sync::mpsc::Sender, +} + +enum WriterJob { + Write(PathBuf, Vec), + /// Answered once every earlier write is done (tests). + #[cfg(test)] + Flush(std::sync::mpsc::Sender<()>), +} + +impl Writer { + fn spawn() -> Self { + let (tx, rx) = std::sync::mpsc::channel::(); + let spawned = std::thread::Builder::new().name("codedeck-web-writer".into()).spawn(move || { + for job in rx { + match job { + WriterJob::Write(path, bytes) => { + if let Err(e) = crate::state::write_private(&path, &bytes) { + log::warn!("[Web] cannot write {}: {e}", path.display()); + } + } + #[cfg(test)] + WriterJob::Flush(done) => { + let _ = done.send(()); + } + } + } + }); + if let Err(e) = spawned { + log::warn!("[Web] no writer thread ({e}); signed-in browsers will not survive a restart"); + } + Self { tx } + } + + fn write(&self, path: PathBuf, bytes: Vec) { + let _ = self.tx.send(WriterJob::Write(path, bytes)); + } + + #[cfg(test)] + fn flush(&self) { + let (done, wait) = std::sync::mpsc::channel(); + if self.tx.send(WriterJob::Flush(done)).is_ok() { + let _ = wait.recv(); + } + } +} + /// What sign-in starts are counted by: an IPv4 address, or an IPv6 /// address's /64. One host holds a whole /64 and can pick any address in it, /// so counting single IPv6 addresses would let it start without limit. -fn rate_key(peer: IpAddr) -> IpAddr { +pub(crate) fn rate_key(peer: IpAddr) -> IpAddr { match peer { IpAddr::V4(v4) => IpAddr::V4(v4), IpAddr::V6(v6) => match v6.to_ipv4_mapped() { @@ -719,11 +771,22 @@ struct Response { content_type: &'static str, body: Vec, set_cookie: Option, + /// A config write this answer waits on, done off the bridge's thread + /// ([`serve`]): the answer stands only if it succeeds. + config_write: Option, +} + +/// Config-file changes the page validated, still to be written. +struct ConfigWrite { + path: PathBuf, + changes: Vec<(String, Option)>, + /// Who asked, for the log line (an npub prefix). + by: String, } impl Response { fn new(status: u16, content_type: &'static str, body: impl Into>) -> Self { - Self { status, content_type, body: body.into(), set_cookie: None } + Self { status, content_type, body: body.into(), set_cookie: None, config_write: None } } fn json(status: u16, body: String) -> Self { @@ -828,13 +891,47 @@ pub async fn read_head(stream: &mut S) -> Option> /// Serve one page request whose head is in `buf`, from a browser at `peer`. pub async fn serve(buf: &[u8], mut stream: S, peer: IpAddr, web: &Web) { - let response = match read_request(buf, &mut stream).await { + // The page shares the bridge's one thread with the relays, the engine + // and the phones' links: past this many requests at once, a page request + // is turned away rather than let it queue work in front of theirs. + if web.serving.get() >= MAX_PAGE_REQUESTS { + write_response(&mut stream, Response::error(503)).await; + return; + } + web.serving.set(web.serving.get() + 1); + let mut response = match read_request(buf, &mut stream).await { Ok(request) => route(&request, peer, web), Err(status) => Response::error(status), }; + if let Some(write) = response.config_write.take() { + response = write_config(write).await; + } + web.serving.set(web.serving.get() - 1); write_response(&mut stream, response).await; } +/// Write validated config changes on the blocking pool: a write ends in an +/// fsync, which on a slow disk would stall every phone's traffic for as long +/// if it ran on the bridge's thread. +async fn write_config(write: ConfigWrite) -> Response { + let ConfigWrite { path, changes, by } = write; + let keys: Vec = changes.iter().map(|(key, _)| key.clone()).collect(); + match tokio::task::spawn_blocking(move || crate::config::write_web_settings(&path, &changes)).await { + Ok(Ok(())) => { + log::info!("[Web] config changed by {by}: keys {}", keys.join(", ")); + Response::json(200, serde_json::json!({ "ok": true, "restartNeeded": true }).to_string()) + } + Ok(Err(err)) => { + log::warn!("[Web] config write failed: {err}"); + Response::error(500) + } + Err(err) => { + log::warn!("[Web] config write did not run: {err}"); + Response::error(500) + } + } +} + fn route(request: &Request, peer: IpAddr, web: &Web) -> Response { let Some(host) = request.host.as_deref().filter(|h| host_allowed(h, &web.hosts)) else { return Response::error(403); @@ -1148,6 +1245,7 @@ mod tests { let dir = tempfile::tempdir().unwrap(); let (web, mut inputs) = web_in(dir.path()); let token = sign_in(&web, &mut inputs); + web.writer.flush(); // A new page over the same home, as after a restart. let (again, _rx) = web_in(dir.path()); @@ -1323,8 +1421,11 @@ mod tests { }) .to_string() .into_bytes(); - let response = route(&post, PEER, &web); + let mut response = route(&post, PEER, &web); assert_eq!(response.status, 200); + // The write runs on the blocking pool in `serve`; here, in place. + let write = response.config_write.take().expect("a write to do"); + crate::config::write_web_settings(&write.path, &write.changes).unwrap(); let json: Value = serde_json::from_slice(&response.body).unwrap(); assert_eq!(json["ok"], true); assert_eq!(json["restartNeeded"], true); @@ -1342,7 +1443,10 @@ mod tests { let mut clear = request("POST", "/api/config", HOST); clear.cookie = Some(sign_in(&web, &mut inputs)); clear.body = serde_json::json!({ "secrets": { "relayRegisterToken": null } }).to_string().into_bytes(); - assert_eq!(route(&clear, PEER, &web).status, 200); + let mut cleared = route(&clear, PEER, &web); + assert_eq!(cleared.status, 200); + let write = cleared.config_write.take().expect("a write to do"); + crate::config::write_web_settings(&write.path, &write.changes).unwrap(); let written: Value = serde_json::from_str(&std::fs::read_to_string(&path).unwrap()).unwrap(); assert!(written.get("relayRegisterToken").is_none(), "cleared"); } From ee18efb4d4ce71829e17b03f6dc12ddd6298642f Mon Sep 17 00:00:00 2001 From: deymosh <232244450+deymosh@users.noreply.github.com> Date: Fri, 16 Oct 2026 21:26:22 +0200 Subject: [PATCH 19/30] feat(bridge): the web page's Browsers, Devices and Settings tabs - Browsers: every signed-in browser (which browser and system, its address, when it signed in and was last seen, which identity let it in), this one marked, each with Sign out. - Devices: the paired phones, with their key, when they paired, how many copies of the app each has, whether one is here now and until when their keys are valid. Read-only: pairing and unpairing stay with the phone and the machine. - Settings: the safe set as a form (machine name, relays, direct link addresses, transcripts kept, and an admin token beside its endpoint, write-only: shown as set or not, typed to replace, ticked to clear). A field a flag or an environment variable overrides is shown disabled, saying so. Everything else is listed read-only under "Set on the machine". Saving says the bridge needs a restart to apply it. The form is built once per visit to the tab, so the page's poll never wipes what is being typed. Co-Authored-By: Claude Code --- crates/bridge-runtime/web/app.css | 20 ++++ crates/bridge-runtime/web/app.js | 156 ++++++++++++++++++++++++++- crates/bridge-runtime/web/index.html | 37 +++++++ 3 files changed, 209 insertions(+), 4 deletions(-) diff --git a/crates/bridge-runtime/web/app.css b/crates/bridge-runtime/web/app.css index df893cad..84f5dd70 100644 --- a/crates/bridge-runtime/web/app.css +++ b/crates/bridge-runtime/web/app.css @@ -101,6 +101,26 @@ table.sessions { width: 100%; border-collapse: collapse; } .meter-fill.busy { background: var(--busy); } .meter-fill.bad { background: var(--bad); } +.rows { display: flex; flex-direction: column; } +.row { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 12px 0; border-bottom: 1px solid var(--line); } +.row:last-child { border-bottom: none; } +.row-main { min-width: 0; display: flex; flex-direction: column; gap: 4px; } +.row-main > div { overflow-wrap: anywhere; } +.row-title { display: flex; align-items: center; gap: 8px; font-weight: 500; } +button.danger:hover { color: var(--bad); border-color: var(--bad); } + +.form { display: flex; flex-direction: column; gap: 18px; } +.field { display: flex; flex-direction: column; gap: 6px; } +.field-label { font-weight: 500; } +.field input, .field textarea { font: inherit; color: var(--text); background: var(--raised); border: 1px solid var(--line); border-radius: 10px; padding: 10px 12px; width: 100%; } +.field textarea { resize: vertical; } +.field input:focus, .field textarea:focus { outline: none; border-color: var(--dim); } +.field input:disabled, .field textarea:disabled { color: var(--muted); } +.check { display: flex; align-items: center; gap: 6px; } +.actions { display: flex; align-items: center; gap: 14px; margin-top: 18px; } +.actions .primary { margin-top: 0; } +.ok { color: var(--ok); } + @media (max-width: 600px) { main { padding: 16px; } .bar { padding: 12px 16px; } diff --git a/crates/bridge-runtime/web/app.js b/crates/bridge-runtime/web/app.js index a4c3a584..97301fc9 100644 --- a/crates/bridge-runtime/web/app.js +++ b/crates/bridge-runtime/web/app.js @@ -4,7 +4,7 @@ "use strict"; const views = ["loading", "signed-out", "pending", "dashboard"]; -const tabs = ["overview", "usage"]; +const tabs = ["overview", "usage", "browsers", "devices", "settings"]; let pollTimer = null; let expiresAt = 0; // The latest status, so switching tabs renders at once instead of waiting @@ -18,12 +18,12 @@ function show(view) { $("sign-out").hidden = view !== "dashboard"; } -async function api(path, method = "GET") { +async function api(path, method = "GET", payload = {}) { const response = await fetch(path, { method, credentials: "same-origin", headers: method === "POST" ? { "Content-Type": "application/json" } : {}, - body: method === "POST" ? "{}" : undefined, + body: method === "POST" ? JSON.stringify(payload) : undefined, }); const body = await response.json().catch(() => ({})); return { status: response.status, body }; @@ -168,6 +168,9 @@ function render() { for (const pane of document.querySelectorAll("[data-pane]")) pane.hidden = pane.dataset.pane !== tab; $("signed-in-as").textContent = `Signed in by ${body.signedInBy.slice(0, 16)}… ${relative(body.signedInSince)}.`; if (tab === "usage") usage(hb); + else if (tab === "browsers") browsers(); + else if (tab === "devices") devices(); + else if (tab === "settings") settings(); else overview(body, hb); } @@ -253,7 +256,152 @@ function usage(hb) { })); } -window.addEventListener("hashchange", render); +/** "Firefox on Windows" from a User-Agent, or the string itself. */ +function browserName(agent) { + if (!agent) return "A browser"; + const name = /Edg\//.test(agent) ? "Edge" : /OPR\//.test(agent) ? "Opera" : /Firefox\//.test(agent) ? "Firefox" + : /Chrome\//.test(agent) ? "Chrome" : /Safari\//.test(agent) ? "Safari" : null; + const os = /Android/.test(agent) ? "Android" : /iPhone|iPad/.test(agent) ? "iOS" : /Windows/.test(agent) ? "Windows" + : /Mac OS X/.test(agent) ? "macOS" : /Linux/.test(agent) ? "Linux" : null; + return name ? (os ? `${name} on ${os}` : name) : agent; +} + +async function browsers() { + const { status, body } = await api("/api/browsers"); + if (status !== 200) return; + $("browsers").replaceChildren(...(body.browsers || []).map((b) => { + const out = el("button", { class: "quiet danger", type: "button" }, "Sign out"); + out.addEventListener("click", async () => { + if (!confirm(b.current ? "Sign this browser out?" : `Sign out ${browserName(b.agent)} at ${b.peer}?`)) return; + const answer = await api("/api/browsers/sign-out", "POST", { id: b.id }); + $("browsers-error").hidden = answer.status === 200; + $("browsers-error").textContent = "The bridge did not sign it out."; + if (b.current && answer.status === 200) return refresh(); + browsers(); + }); + return el("div", { class: "row" }, + el("div", { class: "row-main" }, + el("div", { class: "row-title" }, browserName(b.agent), b.current ? el("span", { class: "chip" }, "this browser") : null), + el("div", { class: "dim small" }, `${b.peer} · signed in ${relative(b.sinceMs)} · seen ${relative(b.lastSeenMs)} · by ${b.by.slice(0, 16)}…`)), + out); + })); +} + +async function devices() { + const { status, body } = await api("/api/devices"); + if (status !== 200) return; + const list = body.devices || []; + $("no-devices").hidden = list.length > 0; + const now = Date.now(); + $("devices").replaceChildren(...list.map((d) => { + const present = d.clients.filter((c) => c.presentUntilMs > now).length; + const clients = d.clients.length; + const lapse = Math.max(0, ...d.clients.map((c) => c.expiresAt * 1000)); + return el("div", { class: "row" }, + el("div", { class: "row-main" }, + el("div", { class: "row-title" }, d.label || "A phone", present ? el("span", { class: "state ok" }, "here now") : null), + el("div", { class: "dim small mono" }, d.npub), + el("div", { class: "dim small" }, + `Paired ${relative(d.pairedAt)} · ${clients} ${clients === 1 ? "copy of the app" : "copies of the app"}` + + (lapse ? ` · keys valid until ${new Date(lapse).toLocaleDateString()}` : "")))); + })); +} + +// What each setting is called on the page, and how it is edited. +const SETTINGS = { + machineName: { label: "Machine name", kind: "text" }, + relays: { label: "Relays", kind: "list", hint: "One per line: wss://, or ws:// only to an .onion address." }, + "direct.endpoints": { label: "Direct link addresses", kind: "list", hint: "Where phones dial the bridge, in order. One per line." }, + transcriptKeepLast: { label: "Transcripts kept", kind: "number", hint: "The newest this many; empty keeps them all." }, + relayRegisterToken: { label: "Relay admin token", kind: "secret", needs: "relayRegisterEndpoint" }, + blossomRegisterToken: { label: "Blossom admin token", kind: "secret", needs: "blossomRegisterEndpoint" }, +}; +const FIXED_LABELS = { + workspaceRoots: "Workspace", torProxyUrl: "Tor proxy", nodePath: "Node", agentHostPath: "Agent host", + testMode: "Test mode", "direct.listen": "Direct link listens on", "direct.onionListen": "Onion listener", + relayRegisterEndpoint: "Relay admin endpoint", blossomRegisterEndpoint: "Blossom admin endpoint", +}; +// The form is built once per visit to the tab, so a poll does not wipe what +// is being typed. +let settingsShown = false; + +function shownValue(v) { + if (v === null || v === undefined || v === "") return "—"; + if (Array.isArray(v)) return v.length ? v.join("\n") : "—"; + return String(v); +} + +async function settings() { + if (settingsShown) return; + const { status, body } = await api("/api/config"); + if (status !== 200) return; + settingsShown = true; + const fields = body.fields || []; + const byKey = Object.fromEntries(fields.map((f) => [f.key, f])); + // A token is offered only beside its endpoint: one without the other does nothing. + const editable = fields.filter((f) => f.editable && SETTINGS[f.key] + && (!SETTINGS[f.key].needs || (byKey[SETTINGS[f.key].needs] && byKey[SETTINGS[f.key].needs].value))); + $("settings-fields").replaceChildren(...editable.map((f) => { + const spec = SETTINGS[f.key]; + let input; + if (spec.kind === "list") { + input = el("textarea", { rows: "3", spellcheck: "false", class: "mono" }); + input.value = (f.value || []).join("\n"); + } else if (spec.kind === "secret") { + input = el("input", { type: "password", placeholder: f.set ? "Set — type to replace" : "Not set" }); + } else { + input = el("input", { type: spec.kind === "number" ? "number" : "text", min: "0" }); + input.value = f.value ?? ""; + } + input.dataset.key = f.key; + input.dataset.kind = spec.kind; + if (f.overridden) input.disabled = true; + const note = f.overridden ? "Set by a flag or an environment variable, which wins over the file." : spec.hint; + const clear = spec.kind === "secret" && f.set && !f.overridden + ? el("label", { class: "check small dim" }, el("input", { type: "checkbox", "data-clear": f.key }), " Clear it") + : null; + return el("label", { class: "field" }, el("span", { class: "field-label" }, spec.label), input, + note ? el("span", { class: "dim small" }, note) : null, clear); + })); + $("settings-fixed").replaceChildren(...fields.filter((f) => !f.editable).flatMap((f) => [ + el("dt", {}, FIXED_LABELS[f.key] || f.key), el("dd", { class: "mono" }, shownValue(f.value)), + ])); +} + +$("settings-form").addEventListener("submit", async (event) => { + event.preventDefault(); + const set = {}; + const secrets = {}; + for (const input of $("settings-fields").querySelectorAll("[data-key]")) { + if (input.disabled) continue; + const { key, kind } = input.dataset; + if (kind === "secret") { + if (input.value) secrets[key] = input.value; + } else if (kind === "list") { + set[key] = input.value.split("\n").map((line) => line.trim()).filter(Boolean); + } else if (kind === "number") { + set[key] = input.value === "" ? null : Number(input.value); + } else { + set[key] = input.value.trim(); + } + } + for (const box of $("settings-fields").querySelectorAll("[data-clear]")) if (box.checked) secrets[box.dataset.clear] = null; + const result = $("settings-result"); + const answer = await api("/api/config", "POST", { set, secrets }); + if (answer.status === 200) { + result.className = "small ok"; + result.textContent = "Saved. Restart the bridge to apply it."; + for (const input of $("settings-fields").querySelectorAll("input[type=password]")) input.value = ""; + } else { + result.className = "small error"; + result.textContent = answer.body.error ? `${SETTINGS[answer.body.key]?.label || answer.body.key}: ${answer.body.error}` : "The bridge did not save it."; + } +}); + +window.addEventListener("hashchange", () => { + settingsShown = false; + render(); +}); $("start").addEventListener("click", start); $("sign-out").addEventListener("click", async () => { diff --git a/crates/bridge-runtime/web/index.html b/crates/bridge-runtime/web/index.html index f6e6eb62..4bd75ee6 100644 --- a/crates/bridge-runtime/web/index.html +++ b/crates/bridge-runtime/web/index.html @@ -45,6 +45,9 @@

Sign in with your phone

@@ -88,6 +91,40 @@

Context in use

What the bridge reports about each session. An agent's plan limits are on the phone, in a session's usage.

+ + + + + +

From 6d5fd544aff38fae4607a2553cfda180d413fb4c Mon Sep 17 00:00:00 2001 From: deymosh <232244450+deymosh@users.noreply.github.com> Date: Fri, 16 Oct 2026 21:28:59 +0200 Subject: [PATCH 20/30] fix(android): the web sign-in no longer says a bridge restart signs the browser out The bridge now keeps signed-in browsers across restarts, so the confirmation promises what is true: 30 days, or until it is signed out (by itself, or from another browser's Browsers tab). Co-Authored-By: Claude Code --- .../plus/ui/screens/MachineWebPage.kt | 2 +- ...signSnapshotTest_web_sign_in_signed_in.png | Bin 36437 -> 33981 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/android/app/src/main/java/com/codedeck/plus/ui/screens/MachineWebPage.kt b/apps/android/app/src/main/java/com/codedeck/plus/ui/screens/MachineWebPage.kt index 5fb6a90d..ebed5e70 100644 --- a/apps/android/app/src/main/java/com/codedeck/plus/ui/screens/MachineWebPage.kt +++ b/apps/android/app/src/main/java/com/codedeck/plus/ui/screens/MachineWebPage.kt @@ -168,7 +168,7 @@ fun WebSignInContent( EmptyState( icon = Icons.Outlined.Check, title = "Browser signed in", - body = "It opens the dashboard now, and stays signed in for 30 days, until it signs out or the bridge restarts.", + body = "It opens the dashboard now, and stays signed in for 30 days or until it is signed out.", action = "Done", onAction = onBack, modifier = Modifier.fillMaxWidth().padding(top = Tokens.Space7), diff --git a/apps/android/app/src/test/snapshots/images/com.codedeck.plus.ui_DesignSnapshotTest_web_sign_in_signed_in.png b/apps/android/app/src/test/snapshots/images/com.codedeck.plus.ui_DesignSnapshotTest_web_sign_in_signed_in.png index 44472584ca48bcf274da23e86135bf3af794f595..eeaec417131f72a98021f605eaa95bca7e93717c 100644 GIT binary patch literal 33981 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 R?W-neSxF^miTIm<{{^A`3U2@a literal 36437 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 z⪼>7@r1mlFb5vR{q`Vo$eB2q18uVfGGju+MT z420EcPc+5gvrWcm$kWpGj~faI>DExMb*tjiDabo^OgAAEji@P=P{*r&p4PL$h+{At zZ4f0}8&PR=BO`=~B)G^p%;b|V8I%sZK+W{V^q-sHi6{m}e8Ukd<5v_;4jv%!F;^*Z z4{3u^nNqIj3+5shGZDjAV~H&jg)`7Q#-Y;WH2R12XXSbZSI$t zyMQ1yzJ>x@2DoQn_V>yf9@36^K1grbS72WK6w$w#pSgQ^Yq~Xyt~sbIVZcc_Esi; z^p-LUe+ULlCa%#_X>lQ@&~G`hC1=!NmiCD+OuqqBJHrR8Ge=OVo<9@V>+ATB$smqP zm-~mxfIY`0)wcGZGX_iKPoINc`uMIu=Xx*~@tbX8fQHjb9y$Zd7Zo!6AJ3QV^V3}& zpMksVSA6CeZ}qXy8b(LISCd3G3S;6tkvCVfHKqZ21rt6EBw!E zw@W6#_(W0bg3J2OSCvJA}2YR2Bsl&jN6q)*fXI9575DJzx#P_>s$1f#DOpW zvYGvRKHXZzX(*{c3djfrWZ2-We>?`Q4b&C@b(LTDWaR*?d0J)x*EY@f_7{n$BY=n* z%Wl8OI)i2#gN*Oxrn}VW2`snMk{orS4iS@_8)4xRfD%uFBOu|V;8zEXALexdwUk|< z_G4j!7eM=%7o8m-42vp;Xx%c=z{CqRNc+S4HdDeB#)+GZh zVKn8zs*edj$m3{Ksu+|c*W}mkiTQdA%2reag$M@dyMrTHRQ0_qR$u9kEN5=qu2dD+ z|JHh?;3PG75b1lFeZH{gqvgHMky)6hl({=Y0@k<>s!&D6nqaaljo?QWSONOWBw)O0 zf%1ndxvUCxpgaOn7CEqH^wT0>3`~)RDfHKuNReA}US0%Jm%jqJeq;aLK>+1fKNl!) z0au_cU+ytk-1jP}uxmIl2jB%%DZoNw5+p;i6;L>jh)yng?&$>DKYy72O{WR^ zPhI%`p9k`PzR~{k-TW^ZrXXyAJO81d|NXVRm9cbWBMnVx*CiXVq F{{V`w_3Hot From 57e39bacc9a53541bfccf88254ab78d667ade275 Mon Sep 17 00:00:00 2001 From: deymosh <232244450+deymosh@users.noreply.github.com> Date: Fri, 16 Oct 2026 21:38:01 +0200 Subject: [PATCH 21/30] fix(bridge): the web config page cannot leave a bridge that will not start - A direct endpoint is accepted only when the bridge runs the listener it needs (wss:// the direct listener, ws:// the onion one): load refuses to start otherwise, so a page edit could have stopped the bridge until config.json was mended by hand. As a last guard, the changed file must still read as the bridge's config before it is written. - An admin endpoint shows, and its token is offered, before the token is set: the endpoint was read from the pair that exists only once both are. - A field counts as overridden only when load would take the flag or environment value; an empty or unparsable one leaves the file in effect. - The Usage tab's meters show the context window's size, not the window object. Co-Authored-By: Claude Code --- crates/bridge-runtime/src/config.rs | 97 ++++++++++++++++++++--------- crates/bridge-runtime/src/web.rs | 27 +++++++- crates/bridge-runtime/web/app.js | 2 +- 3 files changed, 93 insertions(+), 33 deletions(-) diff --git a/crates/bridge-runtime/src/config.rs b/crates/bridge-runtime/src/config.rs index 762e2f38..9779af54 100644 --- a/crates/bridge-runtime/src/config.rs +++ b/crates/bridge-runtime/src/config.rs @@ -304,6 +304,11 @@ pub struct Config { pub workspace_roots: Vec, pub relay_register: Option, pub blossom_register: Option, + /// The admin endpoints as configured, with or without their token: the + /// page shows an endpoint and offers its token even before the token is + /// set (a register endpoint works only with both). + pub relay_register_endpoint: Option, + pub blossom_register_endpoint: Option, /// SOCKS5 proxy for all Nostr traffic (relays, Blossom, pubkey /// registration), as `host:port`. pub tor_proxy: Option, @@ -484,14 +489,10 @@ pub fn load(flags: &Flags) -> Result { (Some(url), Some(token)) => Some(RegisterEndpoint { url, token }), _ => None, }; - let relay_register = register( - env("CODEDECK_RELAY_REGISTER_ENDPOINT").or(file.relay_register_endpoint), - env("CODEDECK_RELAY_REGISTER_TOKEN").or(file.relay_register_token), - ); - let blossom_register = register( - env("CODEDECK_BLOSSOM_REGISTER_ENDPOINT").or(file.blossom_register_endpoint), - env("CODEDECK_BLOSSOM_REGISTER_TOKEN").or(file.blossom_register_token), - ); + let relay_register_endpoint = env("CODEDECK_RELAY_REGISTER_ENDPOINT").or(file.relay_register_endpoint); + let blossom_register_endpoint = env("CODEDECK_BLOSSOM_REGISTER_ENDPOINT").or(file.blossom_register_endpoint); + let relay_register = register(relay_register_endpoint.clone(), env("CODEDECK_RELAY_REGISTER_TOKEN").or(file.relay_register_token)); + let blossom_register = register(blossom_register_endpoint.clone(), env("CODEDECK_BLOSSOM_REGISTER_TOKEN").or(file.blossom_register_token)); let tor_proxy = flags .tor_proxy .clone() @@ -548,6 +549,8 @@ pub fn load(flags: &Flags) -> Result { workspace_roots, relay_register, blossom_register, + relay_register_endpoint, + blossom_register_endpoint, tor_proxy, transcript_keep_last, node_path: env("CODEDECK_NODE_PATH") @@ -576,20 +579,22 @@ fn overridden_keys(flags: &Flags) -> BTreeSet { } }; mark(flags.machine_name.is_some() || env("CODEDECK_MACHINE_NAME").is_some(), "machineName"); - mark(!flags.relays.is_empty() || env("CODEDECK_RELAYS").is_some(), "relays"); - mark(!flags.workspaces.is_empty() || env("CODEDECK_WORKSPACE_ROOTS").is_some(), "workspaceRoots"); + // An environment value `load` would not take (empty, unparsable) leaves + // the file in effect, so it is no override. + mark(!flags.relays.is_empty() || split_list(env("CODEDECK_RELAYS")).is_some(), "relays"); + mark(!flags.workspaces.is_empty() || split_list(env("CODEDECK_WORKSPACE_ROOTS")).is_some(), "workspaceRoots"); mark(env("CODEDECK_RELAY_REGISTER_ENDPOINT").is_some(), "relayRegisterEndpoint"); mark(env("CODEDECK_RELAY_REGISTER_TOKEN").is_some(), "relayRegisterToken"); mark(env("CODEDECK_BLOSSOM_REGISTER_ENDPOINT").is_some(), "blossomRegisterEndpoint"); mark(env("CODEDECK_BLOSSOM_REGISTER_TOKEN").is_some(), "blossomRegisterToken"); - mark(env("CODEDECK_TRANSCRIPT_KEEP_LAST").is_some(), "transcriptKeepLast"); + mark(env("CODEDECK_TRANSCRIPT_KEEP_LAST").and_then(|v| v.parse::().ok()).is_some(), "transcriptKeepLast"); mark(flags.tor_proxy.is_some() || env("CODEDECK_TOR_PROXY_URL").is_some(), "torProxyUrl"); mark(env("CODEDECK_NODE_PATH").is_some(), "nodePath"); mark(flags.agent_host.is_some() || env("CODEDECK_AGENT_HOST").is_some(), "agentHostPath"); mark(flags.test_mode || env_bool("CODEDECK_TEST_MODE").is_some(), "testMode"); mark(flags.direct_listen.is_some() || env("CODEDECK_DIRECT_LISTEN").is_some(), "direct.listen"); mark(flags.direct_onion_listen.is_some() || env("CODEDECK_DIRECT_ONION_LISTEN").is_some(), "direct.onionListen"); - mark(!flags.direct_endpoints.is_empty() || env("CODEDECK_DIRECT_ENDPOINTS").is_some(), "direct.endpoints"); + mark(!flags.direct_endpoints.is_empty() || split_list(env("CODEDECK_DIRECT_ENDPOINTS")).is_some(), "direct.endpoints"); keys } @@ -603,10 +608,19 @@ pub const WEB_EDITABLE: [&str; 4] = ["machineName", "relays", "direct.endpoints" /// one back, so a token can be replaced but never leaked. pub const WEB_EDITABLE_SECRETS: [&str; 2] = ["relayRegisterToken", "blossomRegisterToken"]; +/// The listeners the bridge runs with, which a direct endpoint needs: `load` +/// refuses to start with a `wss://` endpoint and no direct listener, or a +/// `ws://` one and no onion listener, so the page must not write either. +#[derive(Debug, Clone, Copy, Default)] +pub struct WebListeners { + pub direct: bool, + pub onion: bool, +} + /// Check one value the page wants to write for a safe-set key. The rules /// mirror what `load` accepts, so a written file is one the bridge would -/// read back. -pub fn validate_web_value(key: &str, value: &Value) -> Result<(), String> { +/// read back — a page edit must never leave a bridge that will not start. +pub fn validate_web_value(key: &str, value: &Value, listeners: WebListeners) -> Result<(), String> { match key { "machineName" => { let name = value.as_str().ok_or("machineName: expected a string")?; @@ -639,6 +653,12 @@ pub fn validate_web_value(key: &str, value: &Value) -> Result<(), String> { if !is_direct_endpoint(url) { return Err(format!("direct.endpoints: {url:?} must be wss://, or ws:// only to a .onion")); } + if url.starts_with("wss://") && !listeners.direct { + return Err(format!("direct.endpoints: {url:?} needs the direct listener, which this bridge does not run")); + } + if url.starts_with("ws://") && !listeners.onion { + return Err(format!("direct.endpoints: {url:?} needs the onion listener, which this bridge does not run")); + } } Ok(()) } @@ -682,6 +702,9 @@ pub fn write_web_settings(path: &Path, changes: &[(String, Option)]) -> R plain => set_or_remove(obj, plain, value.clone()), } } + // The last guard against a file the bridge could not start from: what is + // written must still read as its config. + serde_json::from_value::(root.clone()).map_err(|e| format!("the changed config would not load: {e}"))?; let json = serde_json::to_vec_pretty(&root).map_err(|e| e.to_string())?; crate::state::write_private(path, &json).map_err(|e| format!("cannot write {}: {e}", path.display())) } @@ -722,8 +745,8 @@ pub fn web_config_fields(config: &Config) -> Vec { field("testMode", Value::from(config.test_mode), false), field("direct.listen", config.direct.listen.map(|a| Value::from(a.to_string())).unwrap_or(Value::Null), false), field("direct.onionListen", config.direct.onion_listen.map(|a| Value::from(a.to_string())).unwrap_or(Value::Null), false), - field("relayRegisterEndpoint", config.relay_register.as_ref().map(|r| Value::from(r.url.clone())).unwrap_or(Value::Null), false), - field("blossomRegisterEndpoint", config.blossom_register.as_ref().map(|r| Value::from(r.url.clone())).unwrap_or(Value::Null), false), + field("relayRegisterEndpoint", config.relay_register_endpoint.clone().map(Value::from).unwrap_or(Value::Null), false), + field("blossomRegisterEndpoint", config.blossom_register_endpoint.clone().map(Value::from).unwrap_or(Value::Null), false), secret("relayRegisterToken", config.relay_register.is_some(), true), secret("blossomRegisterToken", config.blossom_register.is_some(), true), ] @@ -952,27 +975,37 @@ mod tests { assert!(err.contains("invalid config")); } + const ALL: WebListeners = WebListeners { direct: true, onion: true }; + + #[test] + fn a_direct_endpoint_needs_the_listener_load_requires() { + let none = WebListeners::default(); + assert!(validate_web_value("direct.endpoints", &serde_json::json!(["wss://192.168.1.9:7447"]), none).is_err()); + assert!(validate_web_value("direct.endpoints", &serde_json::json!(["ws://abc.onion:7448"]), WebListeners { direct: true, onion: false }).is_err()); + assert!(validate_web_value("direct.endpoints", &serde_json::json!(["wss://192.168.1.9:7447"]), WebListeners { direct: true, onion: false }).is_ok()); + } + #[test] fn the_safe_set_validates_names_relays_and_endpoints() { // A machine name: 1 to 64 characters, no control characters. - assert!(validate_web_value("machineName", &Value::from("laptop")).is_ok()); - assert!(validate_web_value("machineName", &Value::from("")).is_err()); - assert!(validate_web_value("machineName", &Value::from("a".repeat(65))).is_err()); - assert!(validate_web_value("machineName", &Value::from("two\nlines")).is_err()); + assert!(validate_web_value("machineName", &Value::from("laptop"), ALL).is_ok()); + assert!(validate_web_value("machineName", &Value::from(""), ALL).is_err()); + assert!(validate_web_value("machineName", &Value::from("a".repeat(65)), ALL).is_err()); + assert!(validate_web_value("machineName", &Value::from("two\nlines"), ALL).is_err()); // Relays: wss:// anywhere, ws:// only to a .onion, at least one. - assert!(validate_web_value("relays", &serde_json::json!(["wss://relay.example", "ws://abc.onion:80"])).is_ok()); - assert!(validate_web_value("relays", &serde_json::json!(["ws://192.168.1.9:7447"])).is_err()); - assert!(validate_web_value("relays", &serde_json::json!([])).is_err()); + assert!(validate_web_value("relays", &serde_json::json!(["wss://relay.example", "ws://abc.onion:80"]), ALL).is_ok()); + assert!(validate_web_value("relays", &serde_json::json!(["ws://192.168.1.9:7447"]), ALL).is_err()); + assert!(validate_web_value("relays", &serde_json::json!([]), ALL).is_err()); // Direct endpoints: the same rule, but an empty list is allowed. - assert!(validate_web_value("direct.endpoints", &serde_json::json!([])).is_ok()); - assert!(validate_web_value("direct.endpoints", &serde_json::json!(["wss://192.168.1.9:7447"])).is_ok()); - assert!(validate_web_value("direct.endpoints", &serde_json::json!(["https://x"])).is_err()); + assert!(validate_web_value("direct.endpoints", &serde_json::json!([]), ALL).is_ok()); + assert!(validate_web_value("direct.endpoints", &serde_json::json!(["wss://192.168.1.9:7447"]), ALL).is_ok()); + assert!(validate_web_value("direct.endpoints", &serde_json::json!(["https://x"]), ALL).is_err()); // Retention: a whole number, or null to clear. - assert!(validate_web_value("transcriptKeepLast", &Value::from(0)).is_ok()); - assert!(validate_web_value("transcriptKeepLast", &Value::Null).is_ok()); - assert!(validate_web_value("transcriptKeepLast", &Value::from(-1)).is_err()); + assert!(validate_web_value("transcriptKeepLast", &Value::from(0), ALL).is_ok()); + assert!(validate_web_value("transcriptKeepLast", &Value::Null, ALL).is_ok()); + assert!(validate_web_value("transcriptKeepLast", &Value::from(-1), ALL).is_err()); // Anything else is not the page's to change. - assert!(validate_web_value("nodePath", &Value::from("/usr/bin/node")).is_err()); + assert!(validate_web_value("nodePath", &Value::from("/usr/bin/node"), ALL).is_err()); assert!(validate_web_secret("relayRegisterToken", &Value::from("tok")).is_ok()); assert!(validate_web_secret("relayRegisterToken", &Value::Null).is_ok()); assert!(validate_web_secret("relayRegisterToken", &Value::from("")).is_err()); @@ -1020,6 +1053,9 @@ mod tests { workspace_roots: vec![PathBuf::from("/srv/w")], relay_register: Some(RegisterEndpoint { url: "https://relay.example/admin".into(), token: "s3cret".into() }), blossom_register: None, + relay_register_endpoint: Some("https://relay.example/admin".into()), + // An endpoint whose token is not set yet: shown, its token offered. + blossom_register_endpoint: Some("https://blossom.example/admin".into()), tor_proxy: Some("127.0.0.1:9050".into()), transcript_keep_last: Some(5), node_path: "node".into(), @@ -1046,6 +1082,7 @@ mod tests { assert_eq!(token["set"], true); assert!(token.get("value").is_none()); assert_eq!(of("blossomRegisterToken")["set"], false); + assert_eq!(of("blossomRegisterEndpoint")["value"], "https://blossom.example/admin", "an endpoint shows before its token is set"); assert!(!serde_json::to_string(&fields).unwrap().contains("s3cret"), "no secret value is in the view"); } } diff --git a/crates/bridge-runtime/src/web.rs b/crates/bridge-runtime/src/web.rs index c3bdc69f..626023f0 100644 --- a/crates/bridge-runtime/src/web.rs +++ b/crates/bridge-runtime/src/web.rs @@ -426,6 +426,13 @@ impl Web { self.writer.write(self.sessions_path.clone(), json); } + /// The listeners in effect, from the config the page shows. + fn listeners(&self) -> crate::config::WebListeners { + let fields = self.config_fields.borrow(); + let running = |key: &str| fields.iter().any(|f| f["key"] == key && !f["value"].is_null()); + crate::config::WebListeners { direct: running("direct.listen"), onion: running("direct.onionListen") } + } + /// The page stopped showing a pending browser's code: the engine must not /// let a phone use it. fn withdraw(&self, browser: &Browser) { @@ -508,7 +515,7 @@ impl Web { if !crate::config::WEB_EDITABLE.contains(&key.as_str()) { return bad_request(key, "not a setting the page may change"); } - if let Err(message) = crate::config::validate_web_value(key, value) { + if let Err(message) = crate::config::validate_web_value(key, value, self.listeners()) { return bad_request(key, &message); } changes.push((key.clone(), Some(value.clone()))); @@ -1405,12 +1412,28 @@ mod tests { assert_eq!(std::fs::read_to_string(&path).unwrap(), before, "the file is untouched"); } + #[test] + fn an_endpoint_the_bridge_has_no_listener_for_is_refused() { + let dir = tempfile::tempdir().unwrap(); + let path = dir.path().join("config.json"); + std::fs::write(&path, "{}").unwrap(); + let (web, mut inputs) = web_with_config(dir.path(), Vec::new()); + let mut post = request("POST", "/api/config", HOST); + post.cookie = Some(sign_in(&web, &mut inputs)); + post.body = serde_json::json!({ "set": { "direct.endpoints": ["ws://abc.onion:7448"] } }).to_string().into_bytes(); + let response = route(&post, PEER, &web); + assert_eq!(response.status, 400, "the bridge would refuse to start from it"); + assert_eq!(std::fs::read_to_string(&path).unwrap(), "{}"); + } + #[test] fn a_config_post_writes_the_file_keeping_every_other_key() { let dir = tempfile::tempdir().unwrap(); let path = dir.path().join("config.json"); std::fs::write(&path, r#"{"machineName":"desktop","direct":{"listen":"0.0.0.0:7447"},"keepMe":{"x":1}}"#).unwrap(); - let (web, mut inputs) = web_with_config(dir.path(), Vec::new()); + // The bridge runs the direct listener, so a wss:// endpoint is one it can serve. + let listening = serde_json::json!({ "key": "direct.listen", "value": "0.0.0.0:7447", "editable": false, "secret": false, "overridden": false }); + let (web, mut inputs) = web_with_config(dir.path(), vec![listening]); let token = sign_in(&web, &mut inputs); let mut post = request("POST", "/api/config", HOST); diff --git a/crates/bridge-runtime/web/app.js b/crates/bridge-runtime/web/app.js index 97301fc9..cc279936 100644 --- a/crates/bridge-runtime/web/app.js +++ b/crates/bridge-runtime/web/app.js @@ -250,7 +250,7 @@ function usage(hb) { return el("div", { class: "meter" }, el("div", { class: "meter-head" }, el("span", { class: "meter-title", title: s.title || s.slug }, s.title || s.slug), - el("span", { class: "dim small" }, `${agentName[s.agent] || s.agent} · ${Math.round(pct)}%${window}`)), + el("span", { class: "dim small" }, `${agentName[s.agent] || s.agent} · ${Math.round(pct)}%${size}`)), el("div", { class: "meter-track" }, fill), ); })); From 92afdb08c530a109fd77745fd903e943486e0e7a Mon Sep 17 00:00:00 2001 From: deymosh <232244450+deymosh@users.noreply.github.com> Date: Sat, 17 Oct 2026 18:02:07 +0200 Subject: [PATCH 22/30] fix(bridge): the web page has no way in without a phone The development switch that let a browser on a private address see the page without signing in is gone, with its banner and its compose entry: the page shows the machine's sessions and agents, and a LAN or VPN is not a trusted place, so a phone's sign-in is the only way in. Co-Authored-By: Claude Code --- crates/bridge-runtime/src/web.rs | 36 +++------------------------- crates/bridge-runtime/web/app.css | 1 - crates/bridge-runtime/web/app.js | 1 - crates/bridge-runtime/web/index.html | 1 - docker-compose.yml | 3 --- 5 files changed, 3 insertions(+), 39 deletions(-) diff --git a/crates/bridge-runtime/src/web.rs b/crates/bridge-runtime/src/web.rs index 626023f0..4fa7cfb4 100644 --- a/crates/bridge-runtime/src/web.rs +++ b/crates/bridge-runtime/src/web.rs @@ -183,10 +183,6 @@ pub struct Web { /// The next [`Browser::order`]. order: Cell, inputs: mpsc::UnboundedSender, - /// Sign-in switched off for development (`CODEDECK_WEB_NO_SIGN_IN=1`): - /// a browser on a loopback or private address is let in without a - /// phone. Never on by default, logged loudly, and shown on the page. - no_sign_in: bool, /// Where the signed-in browsers are kept between restarts. sessions_path: PathBuf, /// The config file the config API writes. @@ -212,13 +208,6 @@ impl Web { config: ConfigView, ) -> Rc { let hosts = endpoints.iter().filter_map(|url| endpoint_host(url)).collect(); - let no_sign_in = std::env::var("CODEDECK_WEB_NO_SIGN_IN").is_ok_and(|v| v == "1"); - if no_sign_in { - log::warn!( - "[Web] SIGN-IN IS OFF (CODEDECK_WEB_NO_SIGN_IN=1): any browser on a loopback or private \ - address sees this bridge's page without a phone. For development only." - ); - } let sessions_path = home.join("web-sessions.json"); let browsers = load_sessions(&sessions_path); let order = browsers.values().map(|b| b.order).max().unwrap_or(0) + 1; @@ -233,7 +222,6 @@ impl Web { starts: RefCell::default(), order: Cell::new(order), inputs, - no_sign_in, sessions_path, config_file: config.path, config_fields: RefCell::new(config.fields), @@ -447,7 +435,6 @@ impl Web { "machine": self.machine_npub, "signedInBy": by, "signedInSince": since_ms, - "noSignIn": self.no_sign_in, "heartbeat": heartbeat.as_ref().map(|h| serde_json::to_value(h).unwrap_or(serde_json::Value::Null)), }) .to_string() @@ -946,12 +933,7 @@ fn route(request: &Request, peer: IpAddr, web: &Web) -> Response { if request.method == "POST" && request.origin.as_deref() != Some(&format!("https://{host}")) { return Response::error(403); } - let browser = if web.no_sign_in && is_local(peer) { - let access = Access::SignedIn { by: "sign-in switched off".into(), since_ms: 0, expires_ms: u64::MAX }; - Some((String::new(), Browser { access, peer, order: 0, agent: String::new(), last_seen_ms: 0 })) - } else { - web.browser(request.cookie.as_deref()) - }; + let browser = web.browser(request.cookie.as_deref()); match (request.method.as_str(), request.path.as_str()) { ("GET", "/") => Response::new(200, "text/html; charset=utf-8", INDEX_HTML), ("GET", "/app.js") => Response::new(200, "text/javascript; charset=utf-8", APP_JS), @@ -1040,26 +1022,14 @@ fn bad_request(key: &str, message: &str) -> Response { Response::json(400, serde_json::json!({ "error": message, "key": key }).to_string()) } -/// Loopback, a private network (RFC 1918, unique-local IPv6) or link-local: -/// where the development switch lets a browser in without a phone. -fn is_local(ip: IpAddr) -> bool { - match ip { - IpAddr::V4(v4) => v4.is_loopback() || v4.is_private() || v4.is_link_local(), - IpAddr::V6(v6) => { - v6.is_loopback() || (v6.segments()[0] & 0xfe00) == 0xfc00 || (v6.segments()[0] & 0xffc0) == 0xfe80 - || v6.to_ipv4_mapped().is_some_and(|v4| v4.is_loopback() || v4.is_private()) - } - } -} - fn me_json(browser: Option<&Browser>) -> String { let now = now_ms(); match browser.map(|b| &b.access) { Some(Access::Pending { code, expires_ms }) => { serde_json::json!({ "state": "pending", "code": code, "expiresInMs": expires_ms.saturating_sub(now) }) } - Some(Access::SignedIn { by, since_ms, expires_ms }) => { - serde_json::json!({ "state": "signed-in", "by": by, "since": since_ms, "noSignIn": *expires_ms == u64::MAX }) + Some(Access::SignedIn { by, since_ms, .. }) => { + serde_json::json!({ "state": "signed-in", "by": by, "since": since_ms }) } None => serde_json::json!({ "state": "signed-out" }), } diff --git a/crates/bridge-runtime/web/app.css b/crates/bridge-runtime/web/app.css index 84f5dd70..2ff4ed5d 100644 --- a/crates/bridge-runtime/web/app.css +++ b/crates/bridge-runtime/web/app.css @@ -127,4 +127,3 @@ button.danger:hover { color: var(--bad); border-color: var(--bad); } .sessions .folder, .sessions th:nth-child(4) { display: none; } } -.banner { background: rgba(242, 85, 90, 0.12); color: var(--bad); border-bottom: 1px solid rgba(242, 85, 90, 0.4); padding: 10px 24px; font-size: 14px; text-align: center; } diff --git a/crates/bridge-runtime/web/app.js b/crates/bridge-runtime/web/app.js index cc279936..30f150b3 100644 --- a/crates/bridge-runtime/web/app.js +++ b/crates/bridge-runtime/web/app.js @@ -159,7 +159,6 @@ async function dashboard() { function render() { const body = lastStatus; if (!body) return; - $("no-sign-in").hidden = !body.noSignIn; const hb = body.heartbeat || {}; $("machine").textContent = hb.machine || ""; document.title = `${hb.machine || "Bridge"} · CodeDeck+`; diff --git a/crates/bridge-runtime/web/index.html b/crates/bridge-runtime/web/index.html index 4bd75ee6..41e835e4 100644 --- a/crates/bridge-runtime/web/index.html +++ b/crates/bridge-runtime/web/index.html @@ -14,7 +14,6 @@ -

Loading…

diff --git a/docker-compose.yml b/docker-compose.yml index c32c0f83..e6a10549 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -43,9 +43,6 @@ services: # 1 runs terminals (docs/TERMINAL.md): a shell an approved phone # drives. Off unless set; each phone is still approved on the machine. - CODEDECK_TERMINAL=${CODEDECK_TERMINAL:-} - # Development only: the web page lets in browsers on this network - # without a phone sign-in. Never set it on a bridge you rely on. - - CODEDECK_WEB_NO_SIGN_IN=${CODEDECK_WEB_NO_SIGN_IN:-} # The direct link: phones on your network (or VPN) reach the bridge here # without a relay. Only paired phones get past its handshake. ports: From 1cd1cb5e96a96089f7ff76dbe714b94f92e277be Mon Sep 17 00:00:00 2001 From: deymosh <232244450+deymosh@users.noreply.github.com> Date: Sat, 17 Oct 2026 18:04:40 +0200 Subject: [PATCH 23/30] test(android): the machine page's golden shows the Terminal and the Web page groups Both groups landed on the page from separate branches; the golden now renders them together. Co-Authored-By: Claude Code --- ...nFullPageSnapshotTest_settings_machine.png | Bin 53998 -> 47665 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/android/app/src/test/snapshots/images/com.codedeck.plus.ui_DesignFullPageSnapshotTest_settings_machine.png b/apps/android/app/src/test/snapshots/images/com.codedeck.plus.ui_DesignFullPageSnapshotTest_settings_machine.png index 00f1f04d0cbc445671edac3362bb301e9e48c1ad..5cf4e05d5df4e5398c55070d48d9faed8d258c38 100644 GIT binary patch literal 47665 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 F{{o&BV;KMd literal 53998 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 M Date: Sat, 17 Oct 2026 18:18:00 +0200 Subject: [PATCH 24/30] feat(protocol): list and end the browsers signed in to a machine's web page MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The bridge's web page already lets a signed-in browser read which browsers are signed in (`GET /api/browsers`) and end one (`POST /api/browsers/sign-out`), but a paired phone had no way to do either. It now does, so the owner can manage the page's browsers from the phone without opening the page itself. Three messages, v12 with no bump (a new variant is additive within a version): - `web-browsers-request` (phone to bridge, no fields) asks for the list. The phone sends it when the screen opens, never on a timer, so the list is fetched only when someone is looking at it. - `web-browsers {browsers}` (bridge to phone, to the asking client alone) answers with one entry per signed-in browser. Each entry carries the page's short public id — the first 16 hex of the stored key's SHA-256, never the key and never the session token — the npub that signed it in, the sign-in, last-seen and expiry times, the address and the cleaned User-Agent. - `web-browser-sign-out {id}` (phone to bridge) ends one by that id, and is answered with the same `web-browsers`, the fresh list, so a sign-out is confirmed by the list it produced. Corpus fixtures (valid and rejected) and the conformance test's type lists cover the three, so the wire shape is pinned. Co-Authored-By: Claude Code --- crates/protocol/fixtures/corpus.json | 10 ++++- crates/protocol/src/commands.rs | 26 +++++++++++++ crates/protocol/src/events.rs | 44 ++++++++++++++++++++++ crates/protocol/tests/codec_conformance.rs | 7 +++- 4 files changed, 83 insertions(+), 4 deletions(-) diff --git a/crates/protocol/fixtures/corpus.json b/crates/protocol/fixtures/corpus.json index 146152c3..a4c6cb42 100644 --- a/crates/protocol/fixtures/corpus.json +++ b/crates/protocol/fixtures/corpus.json @@ -82,10 +82,13 @@ { "v": 12, "type": "terminal-replay", "term": "t1", "from": 4096 }, { "v": 12, "type": "terminal-takeover", "term": "t1" }, { "v": 12, "type": "terminal-close", "term": "t1" }, - { "v": 12, "type": "web-sign-in", "code": "K7QM-4XPA" } + { "v": 12, "type": "web-sign-in", "code": "K7QM-4XPA" }, + { "v": 12, "type": "web-browsers-request" }, + { "v": 12, "type": "web-browser-sign-out", "id": "0123456789abcdef" } ], "rejected": [ { "v": 12, "type": "web-sign-in" }, + { "v": 12, "type": "web-browser-sign-out" }, { "v": 13, "type": "input", "sessionId": "s", "text": "from a newer phone" }, { "type": "input", "sessionId": "s", "text": "from an unversioned sender" }, { "v": 12, "type": "input", "text": "no session id" }, @@ -219,7 +222,9 @@ { "v": 12, "type": "terminal-event", "term": "t1", "what": "takeover", "device": "bf1f111943b3930a4c64a5c06d9153b2", "name": "Pixel 8", "via": "relay", "at": 1792008058637 }, { "v": 12, "type": "terminal-event", "term": "t1", "what": "closed", "device": "aa11", "via": "direct", "at": 1792008058638 }, { "v": 12, "type": "sessions", "machine": "m", "sessions": [], "agents": [], "terminals": [{ "term": "t1", "shell": "/bin/bash", "opened": 1792008058637, "device": "bf1f111943b3930a4c64a5c06d9153b2", "name": "Pixel 8", "writer": "bf1f111943b3930a4c64a5c06d9153b2", "cols": 80, "rows": 24 }, { "term": "t2", "shell": "/bin/zsh", "opened": 1792008058638, "device": "aa11", "writer": "aa11", "cols": 132, "rows": 43 }] }, - { "v": 12, "type": "web-sign-in-result", "code": "K7QM-4XPA", "signedIn": true } + { "v": 12, "type": "web-sign-in-result", "code": "K7QM-4XPA", "signedIn": true }, + { "v": 12, "type": "web-browsers", "browsers": [] }, + { "v": 12, "type": "web-browsers", "browsers": [{ "id": "0123456789abcdef", "by": "npub1owner", "sinceMs": 1792008058637, "lastSeenMs": 1792008059000, "expiresMs": 1804598458637, "peer": "192.168.1.20", "agent": "Mozilla/5.0 (Android 15)" }] } ], "rejected": [ { "v": 10, "type": "input-ack", "sessionId": "s", "inputId": "i" }, @@ -240,6 +245,7 @@ { "v": 12, "type": "input-failed", "sessionId": "s", "reason": "unknown-reason" }, { "v": 12, "type": "pair-ack", "machine": "m", "ok": true, "reason": "meltdown" }, { "v": 12, "type": "mode-confirmed", "sessionId": "s", "mode": "plan" }, + { "v": 12, "type": "web-browsers" }, { "v": 12, "type": "warp", "sessionId": "s" } ] }, diff --git a/crates/protocol/src/commands.rs b/crates/protocol/src/commands.rs index 69373cad..b08282f5 100644 --- a/crates/protocol/src/commands.rs +++ b/crates/protocol/src/commands.rs @@ -575,6 +575,17 @@ pub struct WebSignInMsg { pub code: String, } +/// `web-browser-sign-out`: end the browser whose page id is `id` — the short +/// id `web-browsers` listed, never the session token. Any paired client may +/// sign out any browser: they are all the owner's. Reply: `web-browsers`, the +/// fresh list with it gone; an id that matches no signed-in browser leaves +/// the list as it was. +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, specta::Type)] +#[serde(rename_all = "camelCase")] +pub struct WebBrowserSignOutMsg { + pub id: String, +} + /// The phone→bridge message union. #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, specta::Type)] #[serde(tag = "type", rename_all = "kebab-case")] @@ -636,6 +647,14 @@ pub enum PhoneToBridge { /// Hang up a terminal. TerminalClose(TerminalIdMsg), WebSignIn(WebSignInMsg), + /// List the browsers signed in to this bridge's web page. No fields. + /// Reply: `web-browsers`, to this client alone. Sent when the user opens + /// the screen that shows them, never on a timer: the list changes only + /// when a browser signs in or out. + WebBrowsersRequest(BareMsg), + /// End one signed-in browser by its page id. Reply: `web-browsers`, the + /// fresh list. + WebBrowserSignOut(WebBrowserSignOutMsg), } #[cfg(test)] @@ -709,6 +728,8 @@ mod tests { rt(&json!({"v":12,"type":"pair-request","npub":"npub1","pubkeyHex":"aa","label":"phone","token":"t","sessionKey":{"pubkeyHex":"bb","bridgePubkeyHex":"cc","expiresAt":1800000000}})); rt(&json!({"v":12,"type":"provider-profiles-request"})); rt(&json!({"v":12,"type":"web-sign-in","code":"K7QM-4XPA"})); + rt(&json!({"v":12,"type":"web-browsers-request"})); + rt(&json!({"v":12,"type":"web-browser-sign-out","id":"0123456789abcdef"})); rt(&json!({"v":12,"type":"session-key","sessionKey":{"pubkeyHex":"bb","bridgePubkeyHex":"cc","expiresAt":1800000000}})); rt(&json!({"v":12,"type":"session-key","sessionKey":{"pubkeyHex":"bb","bridgePubkeyHex":"cc","expiresAt":1800000000,"label":"Pixel 8"}})); rt(&json!({"v":12,"type":"presence","watchingTerminal":"t1"})); @@ -728,6 +749,11 @@ mod tests { assert!(serde_json::from_str::(r#"{"v":12,"type":"terminal-input","term":"t","seq":1}"#).is_err()); } + #[test] + fn a_web_browser_sign_out_must_name_an_id() { + assert!(serde_json::from_str::(r#"{"v":12,"type":"web-browser-sign-out"}"#).is_err()); + } + #[test] fn upload_image_union_disambiguates_by_shape() { let m = rt(&json!({"v":12,"type":"upload-file","sessionId":"s","hash":"h","url":"u","key":"k","iv":"iv","filename":"f","mimeType":"image/png","text":"t","sizeBytes":1})); diff --git a/crates/protocol/src/events.rs b/crates/protocol/src/events.rs index 83e1636c..b512bb95 100644 --- a/crates/protocol/src/events.rs +++ b/crates/protocol/src/events.rs @@ -627,6 +627,44 @@ pub struct WebSignInResultMsg { pub signed_in: bool, } +/// One browser signed in to a bridge's web page, for `web-browsers`. +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, specta::Type)] +#[serde(rename_all = "camelCase")] +pub struct WebBrowserInfo { + /// The page's short public id for this browser: the first 16 hex + /// characters of the SHA-256 of its session key. Never the key itself and + /// never the session token, so a copy of the list can be replayed as + /// nothing; a `web-browser-sign-out` names this. + pub id: String, + /// The npub of the phone identity that signed it in. + pub by: String, + /// When it signed in, ms since the Unix epoch. + #[specta(type = specta_typescript::Number)] + pub since_ms: u64, + /// When it last made an authenticated request, ms since the Unix epoch. + #[specta(type = specta_typescript::Number)] + pub last_seen_ms: u64, + /// When its session lapses, ms since the Unix epoch. + #[specta(type = specta_typescript::Number)] + pub expires_ms: u64, + /// The address it signed in from (an IP; the page keeps no host name). + pub peer: String, + /// Its `User-Agent`, cleaned of control characters and bounded. + pub agent: String, +} + +/// The browsers signed in to the bridge's web page: the answer to +/// `web-browsers`, and — after a `web-browser-sign-out` — the fresh list with +/// the ended browser gone. Sent to the asking client alone; another client +/// that did not ask keeps whatever its own screen last read. +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, specta::Type)] +#[serde(rename_all = "camelCase")] +pub struct WebBrowsersMsg { + /// Signed-in browsers, oldest signed in first. Empty when the bridge runs + /// no web page, and for a browser id a sign-out did not match. + pub browsers: Vec, +} + /// The bridge→phone message union. #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, specta::Type)] #[serde(tag = "type", rename_all = "kebab-case")] @@ -671,6 +709,7 @@ pub enum BridgeToPhone { /// To every present client of the identity. TerminalEvent(TerminalEventMsg), WebSignInResult(WebSignInResultMsg), + WebBrowsers(WebBrowsersMsg), } #[cfg(test)] @@ -816,6 +855,11 @@ mod tests { rt(&json!({"v":12,"type":"terminal-exited","term":"t1","code":0,"reason":"exit"})); rt(&json!({"v":12,"type":"terminal-exited","openId":"o1","reason":"not-allowed","device":"d1"})); rt(&json!({"v":12,"type":"terminal-event","term":"t1","what":"takeover","device":"d1","name":"Pixel 8","via":"relay","at":1792008058637_u64})); + rt(&json!({"v":12,"type":"web-sign-in-result","code":"K7QM-4XPA","signedIn":true})); + rt(&json!({"v":12,"type":"web-browsers","browsers":[]})); + rt(&json!({"v":12,"type":"web-browsers","browsers":[{ + "id":"0123456789abcdef","by":"npub1owner","sinceMs":1792008058637_u64,"lastSeenMs":1792008059000_u64, + "expiresMs":1804598458637_u64,"peer":"192.168.1.20","agent":"Mozilla/5.0"}]})); } #[test] diff --git a/crates/protocol/tests/codec_conformance.rs b/crates/protocol/tests/codec_conformance.rs index 3ab0aff2..b09d8c1b 100644 --- a/crates/protocol/tests/codec_conformance.rs +++ b/crates/protocol/tests/codec_conformance.rs @@ -110,9 +110,11 @@ fn p2b_type(m: &PhoneToBridge) -> &'static str { PhoneToBridge::TerminalTakeover(_) => "terminal-takeover", PhoneToBridge::TerminalClose(_) => "terminal-close", PhoneToBridge::WebSignIn(_) => "web-sign-in", + PhoneToBridge::WebBrowsersRequest(_) => "web-browsers-request", + PhoneToBridge::WebBrowserSignOut(_) => "web-browser-sign-out", } } -const P2B_TYPES: usize = 43; +const P2B_TYPES: usize = 45; /// Every bridge→phone message type, by wire name (see [`p2b_type`]). fn b2p_type(m: &BridgeToPhone) -> &'static str { @@ -155,9 +157,10 @@ fn b2p_type(m: &BridgeToPhone) -> &'static str { BridgeToPhone::TerminalExited(_) => "terminal-exited", BridgeToPhone::TerminalEvent(_) => "terminal-event", BridgeToPhone::WebSignInResult(_) => "web-sign-in-result", + BridgeToPhone::WebBrowsers(_) => "web-browsers", } } -const B2P_TYPES: usize = 38; +const B2P_TYPES: usize = 39; #[test] fn corpus_covers_every_message_type() { From fdfa8ab250e7d2b8746ad1e8d63a2cc00591f985 Mon Sep 17 00:00:00 2001 From: deymosh <232244450+deymosh@users.noreply.github.com> Date: Sat, 17 Oct 2026 18:18:11 +0200 Subject: [PATCH 25/30] feat(bridge): serve the web page's browser list to a paired phone MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The engine holds no browser list — the page does — so both new commands become effects the runtime answers from its own `Web`: `web-browsers` for a request, and for a sign-out the browser is revoked and the fresh list sent, so the answer is always the state that resulted. Both go to the asking client alone, like the other per-client replies. `Web::browsers()` and `GET /api/browsers` now read one shared helper, so the phone's list and the page's own JSON can never disagree about which browsers are signed in or in what order; only the page's rows carry the `current` mark, which only its own request can know. A bridge with no web page (no direct link) answers an empty list rather than staying silent. `revoke` persists through the page's writer thread, so ending a browser never blocks the bridge's one thread. Co-Authored-By: Claude Code --- crates/bridge-core/src/engine/phone.rs | 4 + crates/bridge-core/src/engine/web.rs | 18 +++++ crates/bridge-core/src/io.rs | 10 +++ crates/bridge-core/tests/web_browsers.rs | 56 ++++++++++++++ crates/bridge-runtime/src/runtime.rs | 26 ++++++- crates/bridge-runtime/src/web.rs | 95 +++++++++++++++++++----- 6 files changed, 191 insertions(+), 18 deletions(-) create mode 100644 crates/bridge-core/tests/web_browsers.rs diff --git a/crates/bridge-core/src/engine/phone.rs b/crates/bridge-core/src/engine/phone.rs index 5373b26b..d67e4e1a 100644 --- a/crates/bridge-core/src/engine/phone.rs +++ b/crates/bridge-core/src/engine/phone.rs @@ -65,6 +65,8 @@ fn type_name(msg: &PhoneToBridge) -> &'static str { PhoneToBridge::TerminalTakeover(_) => "terminal-takeover", PhoneToBridge::TerminalClose(_) => "terminal-close", PhoneToBridge::WebSignIn(_) => "web-sign-in", + PhoneToBridge::WebBrowsersRequest(_) => "web-browsers-request", + PhoneToBridge::WebBrowserSignOut(_) => "web-browser-sign-out", } } @@ -196,6 +198,8 @@ impl Engine { PhoneToBridge::TerminalTakeover(m) => self.on_terminal_takeover(m, super::terminal::via_of(via)), PhoneToBridge::TerminalClose(m) => self.on_terminal_close(m, super::terminal::via_of(via)), PhoneToBridge::WebSignIn(m) => self.on_web_sign_in(&m.code, phone), + PhoneToBridge::WebBrowsersRequest(_) => self.on_web_browsers_request(), + PhoneToBridge::WebBrowserSignOut(m) => self.on_web_browser_sign_out(m.id), } } diff --git a/crates/bridge-core/src/engine/web.rs b/crates/bridge-core/src/engine/web.rs index 22df480d..684b3e3f 100644 --- a/crates/bridge-core/src/engine/web.rs +++ b/crates/bridge-core/src/engine/web.rs @@ -71,6 +71,24 @@ impl Engine { } self.publish_to(phone, BridgeToPhone::WebSignInResult(WebSignInResultMsg { code: sent.to_string(), signed_in: live })); } + + /// A paired phone asked which browsers are signed in to the page. The + /// engine holds no browser list — the page does — so this is an effect the + /// runtime answers from its own `Web`, to the client that asked alone. + pub(super) fn on_web_browsers_request(&mut self) { + if let Some(client) = self.requester.clone() { + self.out.push(Effect::WebBrowsers { client }); + } + } + + /// A paired phone ended one signed-in browser by the page id it saw. The + /// engine does not know the browser either, so the runtime revokes it and + /// answers the same client with the fresh list. + pub(super) fn on_web_browser_sign_out(&mut self, id: String) { + if let Some(client) = self.requester.clone() { + self.out.push(Effect::WebBrowserSignOut { id, client }); + } + } } #[cfg(test)] diff --git a/crates/bridge-core/src/io.rs b/crates/bridge-core/src/io.rs index d970c3b4..e2ee3422 100644 --- a/crates/bridge-core/src/io.rs +++ b/crates/bridge-core/src/io.rs @@ -311,6 +311,16 @@ pub enum Effect { /// A paired phone sent the web page's sign-in `code`: the browser /// showing it is signed in, by identity `by` (its npub). WebSignedIn { code: String, by: String }, + /// A paired phone asked which browsers are signed in to the web page + /// (`web-browsers-request`). The engine holds no browser list — the page + /// does — so the runtime answers `client` from its own `Web` with + /// `web-browsers`, an empty list when the bridge runs no page. + WebBrowsers { client: Addressee }, + /// A paired phone ended one signed-in browser (`web-browser-sign-out`) by + /// the page id `id`. The runtime revokes it and answers the same `client` + /// with the fresh list, so an id that matches nothing is still answered + /// with the truth rather than silence. + WebBrowserSignOut { id: String, client: Addressee }, } /// Well-known [`Store`](crate::ports::Store) keys. diff --git a/crates/bridge-core/tests/web_browsers.rs b/crates/bridge-core/tests/web_browsers.rs new file mode 100644 index 00000000..9fe94a0c --- /dev/null +++ b/crates/bridge-core/tests/web_browsers.rs @@ -0,0 +1,56 @@ +//! Listing and ending the browsers signed in to the bridge's web page, through +//! the engine: the phone asks, and the runtime's page — which alone holds the +//! list — answers. The engine only turns each command into the effect that +//! names the asking client. + +mod support; + +use bridge_core::{Effect, Via}; +use protocol::crypto::generate_keypair; +use serde_json::json; +use support::*; + +/// The client a `web-browsers-request` asked the runtime to answer, if any. +fn requested(rig: &mut Rig) -> Option> { + rig.send(json!({"v":12,"type":"web-browsers-request"})); + rig.take().into_iter().find_map(|e| match e { + Effect::WebBrowsers { client } => Some(vec![client.phone]), + _ => None, + }) +} + +#[test] +fn a_request_asks_the_runtime_for_the_list_for_the_asking_client() { + let mut rig = Rig::new(); + let phone = rig.phone.pubkey_hex.clone(); + assert_eq!(requested(&mut rig), Some(vec![phone])); +} + +#[test] +fn a_sign_out_names_the_browser_for_the_runtime_to_end() { + let mut rig = Rig::new(); + let phone = rig.phone.pubkey_hex.clone(); + rig.send(json!({"v":12,"type":"web-browser-sign-out","id":"0123456789abcdef"})); + let (id, to) = rig + .take() + .into_iter() + .find_map(|e| match e { + Effect::WebBrowserSignOut { id, client } => Some((id, vec![client.phone])), + _ => None, + }) + .expect("a sign-out effect"); + assert_eq!(id, "0123456789abcdef"); + assert_eq!(to, vec![phone]); +} + +#[test] +fn an_unpaired_identity_gets_no_list_and_ends_no_browser() { + let mut rig = Rig::new(); + let stranger = generate_keypair(); + rig.phone_event(&stranger, json!({"v":12,"type":"web-browsers-request"}), Via::Relay); + rig.phone_event(&stranger, json!({"v":12,"type":"web-browser-sign-out","id":"0123456789abcdef"}), Via::Relay); + assert!( + rig.take().iter().all(|e| !matches!(e, Effect::WebBrowsers { .. } | Effect::WebBrowserSignOut { .. })), + "a stranger's commands reach no page" + ); +} diff --git a/crates/bridge-runtime/src/runtime.rs b/crates/bridge-runtime/src/runtime.rs index 334837dd..2986f57e 100644 --- a/crates/bridge-runtime/src/runtime.rs +++ b/crates/bridge-runtime/src/runtime.rs @@ -21,7 +21,7 @@ use bridge_core::{ }; use protocol::commands::UploadFileMsg; use protocol::crypto::Keypair; -use protocol::events::{BridgeToPhone, TerminalOutputMsg}; +use protocol::events::{BridgeToPhone, TerminalOutputMsg, WebBrowserInfo, WebBrowsersMsg}; use tokio::sync::mpsc; use tokio::task::JoinHandle; @@ -340,6 +340,13 @@ impl Runtime { false } + /// The browsers signed in to the web page, as the page itself lists them + /// (`Web::browsers`). Empty when this bridge runs no page — no direct + /// link — so a request is still answered, with the truth. + fn web_browsers(&self) -> Vec { + self.direct.as_ref().map(|direct| direct.web.browsers()).unwrap_or_default() + } + /// Carry out one effect; true for [`Effect::Stopped`]. Async because one /// effect does blocking file work that must not run here: opening a /// terminal's recording, which is handed to a blocking task before its @@ -361,6 +368,23 @@ impl Runtime { direct.web.signed_in(&code, &by); } } + // The page alone holds the list of signed-in browsers, so the + // runtime answers both from it: a request with what it has, a + // sign-out by ending that browser and then answering with the + // fresh list. Both go to the asking client alone. + Effect::WebBrowsers { client } => { + let message = BridgeToPhone::WebBrowsers(WebBrowsersMsg { browsers: self.web_browsers() }); + self.relays.publish(vec![client], message); + } + Effect::WebBrowserSignOut { id, client } => { + // `revoke` persists through the web page's own writer thread, + // so ending a browser never blocks the bridge's one thread. + if let Some(direct) = &self.direct { + direct.web.revoke(&id); + } + let message = BridgeToPhone::WebBrowsers(WebBrowsersMsg { browsers: self.web_browsers() }); + self.relays.publish(vec![client], message); + } Effect::Host(frame) => self.host.send(&frame), Effect::SetTimer { id, after_ms } => { let inputs = self.inputs.clone(); diff --git a/crates/bridge-runtime/src/web.rs b/crates/bridge-runtime/src/web.rs index 4fa7cfb4..3df5fa29 100644 --- a/crates/bridge-runtime/src/web.rs +++ b/crates/bridge-runtime/src/web.rs @@ -48,7 +48,7 @@ use std::time::Duration; use base64::Engine as _; use bridge_core::{Input, PairedPhone}; -use protocol::events::SessionListMsg; +use protocol::events::{SessionListMsg, WebBrowserInfo}; use serde_json::Value; use sha2::{Digest, Sha256}; use tokio::io::{AsyncRead, AsyncReadExt, AsyncWrite, AsyncWriteExt}; @@ -363,7 +363,10 @@ impl Web { /// Sign out the browser whose id (the first [`ID_LEN`] hex characters of /// its key) is `id`; false when no signed-in browser has it. Any /// signed-in browser may sign out any other: they are all the owner's. - fn revoke(&self, id: &str) -> bool { + /// The engine asks for this on `web-browser-sign-out`, and the page's own + /// API on `POST /api/browsers/sign-out` — one path, so the two cannot + /// end different browsers. + pub fn revoke(&self, id: &str) -> bool { if id.len() != ID_LEN { return false; } @@ -440,31 +443,59 @@ impl Web { .to_string() } - /// The signed-in browsers, oldest first, for `GET /api/browsers`. - fn browsers_json(&self, current: Option<&str>) -> String { - let mut rows: Vec<(u64, Value)> = self + /// The signed-in browsers, oldest signed in first, as `(key, info)`. The + /// page's own list: both `browsers_json` and `browsers` read it, so what + /// `GET /api/browsers` serves and what a phone's `web-browsers-request` + /// is answered with can never disagree. + fn browser_rows(&self) -> Vec<(String, WebBrowserInfo)> { + let mut rows: Vec<(u64, String, WebBrowserInfo)> = self .browsers .borrow() .iter() .filter_map(|(key, browser)| match &browser.access { Access::SignedIn { by, since_ms, expires_ms } => Some(( browser.order, - serde_json::json!({ - "id": &key[..ID_LEN], - "by": by, - "sinceMs": since_ms, - "lastSeenMs": browser.last_seen_ms, - "expiresMs": expires_ms, - "peer": browser.peer.to_string(), - "agent": browser.agent, - "current": current == Some(key.as_str()), - }), + key.clone(), + WebBrowserInfo { + id: key[..ID_LEN].to_string(), + by: by.clone(), + since_ms: *since_ms, + last_seen_ms: browser.last_seen_ms, + expires_ms: *expires_ms, + peer: browser.peer.to_string(), + agent: browser.agent.clone(), + }, )), Access::Pending { .. } => None, }) .collect(); - rows.sort_by_key(|(order, _)| *order); - serde_json::json!({ "browsers": rows.into_iter().map(|(_, row)| row).collect::>() }).to_string() + rows.sort_by_key(|(order, _, _)| *order); + rows.into_iter().map(|(_, key, info)| (key, info)).collect() + } + + /// The signed-in browsers, oldest signed in first: what a paired phone's + /// `web-browsers-request` is answered with, from the same rows + /// `GET /api/browsers` serves. + pub fn browsers(&self) -> Vec { + self.browser_rows().into_iter().map(|(_, info)| info).collect() + } + + /// The signed-in browsers, oldest first, for `GET /api/browsers`. Each + /// row carries `current` — whether it is the browser asking — which only + /// the page's own request can know. + fn browsers_json(&self, current: Option<&str>) -> String { + let rows: Vec = self + .browser_rows() + .into_iter() + .map(|(key, info)| { + let mut row = serde_json::to_value(&info).unwrap_or(Value::Null); + if let Value::Object(map) = &mut row { + map.insert("current".to_string(), Value::Bool(current == Some(key.as_str()))); + } + row + }) + .collect(); + serde_json::json!({ "browsers": rows }).to_string() } /// The paired identities, for `GET /api/devices`. @@ -1280,6 +1311,36 @@ mod tests { assert!(second.len() > ID_LEN, "the full token is not what the page sees"); } + #[test] + fn the_phone_list_is_the_page_list_without_the_current_mark() { + let (web, mut inputs, _dir) = web(); + let first = sign_in(&web, &mut inputs); + let (_second, _) = web.start_sign_in(PEER, "curl/8").unwrap(); + let Some(Input::WebSignInPending { code, .. }) = inputs.try_recv().ok() else { panic!("the engine is told the code") }; + web.signed_in(&code, "npub1owner"); + + let mut get = request("GET", "/api/browsers", HOST); + get.cookie = Some(first.clone()); + let body: Value = serde_json::from_slice(&route(&get, PEER, &web).body).unwrap(); + let json_ids: Vec = body["browsers"] + .as_array() + .unwrap() + .iter() + .map(|row| row["id"].as_str().unwrap().to_string()) + .collect(); + + // The phone's list and the page's are one list: same rows, same order. + let phone = web.browsers(); + assert_eq!(phone.iter().map(|b| b.id.clone()).collect::>(), json_ids); + assert_eq!(phone[0].id, &token_key(&first)[..ID_LEN], "the id is the key's short public form, never the token"); + assert_eq!(phone[0].by, "npub1owner"); + assert_eq!(phone[0].peer, "192.168.1.20"); + assert_eq!(phone[1].agent, "curl/8"); + for browser in &phone { + assert!(browser.since_ms > 0 && browser.expires_ms > browser.since_ms); + } + } + #[test] fn revoking_another_browser_ends_its_cookie() { let (web, mut inputs, _dir) = web(); From 773ca89b97cd5e274e1b270efb1099ee7051dc87 Mon Sep 17 00:00:00 2001 From: deymosh <232244450+deymosh@users.noreply.github.com> Date: Sat, 17 Oct 2026 18:18:21 +0200 Subject: [PATCH 26/30] feat(client): list and sign out a machine's web page browsers from the phone MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The phone can now show the browsers signed in to a machine's web page and end one, the same thing the page's own APIs do. The list lives in the ui store — transient, so it is never persisted or backed up — as `UiState.web_browsers`, keyed by machine. Two intents: `RequestWebBrowsers` sends the bare request when the screen opens (never on a timer, so an unopened screen costs nothing), and `SignOutWebBrowser` drops the row optimistically before sending, so a browser the user ended does not linger while the answer is in flight. The bridge's `web-browsers` replaces the whole list for its machine, which is what confirms a sign-out. The view carries the list as `UiView.web_browsers`, projected through client-ffi as the `UniffiWebBrowser` record (its `id` is the page's short public id, never the session token). Regenerated the Kotlin bindings. Co-Authored-By: Claude Code --- .../main/java/uniffi/client_ffi/client_ffi.kt | 376 ++++++++++++++---- crates/client-core/src/stores/ui.rs | 64 +++ crates/client-ffi/src/intent.rs | 20 + crates/client-ffi/src/views.rs | 41 ++ crates/client-runtime/src/dispatch.rs | 35 ++ crates/client-runtime/src/intent.rs | 90 ++++- crates/client-runtime/src/runtime.rs | 1 + crates/client-runtime/src/view.rs | 7 +- 8 files changed, 548 insertions(+), 86 deletions(-) diff --git a/apps/android/app/src/main/java/uniffi/client_ffi/client_ffi.kt b/apps/android/app/src/main/java/uniffi/client_ffi/client_ffi.kt index 75e97ad7..682f619b 100644 --- a/apps/android/app/src/main/java/uniffi/client_ffi/client_ffi.kt +++ b/apps/android/app/src/main/java/uniffi/client_ffi/client_ffi.kt @@ -8754,6 +8754,14 @@ data class UniffiUiView ( */ var `webSignIn`: Map , + /** + * Keyed by machine pubkey: the browsers signed in to that machine's web + * page, as the last `web-browsers` listed them. Absent for a machine + * nobody has opened the screen for — the phone asks then, never on a + * timer. + */ + var `webBrowsers`: Map> + , /** * Present while a delete's undo window is open. */ @@ -8788,6 +8796,7 @@ public object FfiConverterTypeUniffiUiView: FfiConverterRustBuffer FfiConverterMapStringTypeUniffiCredentialsAck.read(buf), FfiConverterMapStringTypeUniffiProviderProfileAck.read(buf), FfiConverterMapStringTypeUniffiWebSignIn.read(buf), + FfiConverterMapStringSequenceTypeUniffiWebBrowser.read(buf), FfiConverterOptionalTypeUniffiUndoToast.read(buf), FfiConverterTypeUniffiTerminalsView.read(buf), ) @@ -8802,6 +8811,7 @@ public object FfiConverterTypeUniffiUiView: FfiConverterRustBuffer FfiConverterMapStringTypeUniffiCredentialsAck.allocationSize(value.`credentialsStatus`) + FfiConverterMapStringTypeUniffiProviderProfileAck.allocationSize(value.`providerProfileStatus`) + FfiConverterMapStringTypeUniffiWebSignIn.allocationSize(value.`webSignIn`) + + FfiConverterMapStringSequenceTypeUniffiWebBrowser.allocationSize(value.`webBrowsers`) + FfiConverterOptionalTypeUniffiUndoToast.allocationSize(value.`undoToast`) + FfiConverterTypeUniffiTerminalsView.allocationSize(value.`terminals`) ) @@ -8815,6 +8825,7 @@ public object FfiConverterTypeUniffiUiView: FfiConverterRustBuffer FfiConverterMapStringTypeUniffiCredentialsAck.write(value.`credentialsStatus`, buf) FfiConverterMapStringTypeUniffiProviderProfileAck.write(value.`providerProfileStatus`, buf) FfiConverterMapStringTypeUniffiWebSignIn.write(value.`webSignIn`, buf) + FfiConverterMapStringSequenceTypeUniffiWebBrowser.write(value.`webBrowsers`, buf) FfiConverterOptionalTypeUniffiUndoToast.write(value.`undoToast`, buf) FfiConverterTypeUniffiTerminalsView.write(value.`terminals`, buf) } @@ -8992,6 +9003,75 @@ public object FfiConverterTypeUniffiUsageWindow: FfiConverterRustBuffer { + override fun read(buf: ByteBuffer): UniffiWebBrowser { + return UniffiWebBrowser( + FfiConverterString.read(buf), + FfiConverterString.read(buf), + FfiConverterULong.read(buf), + FfiConverterULong.read(buf), + FfiConverterULong.read(buf), + FfiConverterString.read(buf), + FfiConverterString.read(buf), + ) + } + + override fun allocationSize(value: UniffiWebBrowser) = ( + FfiConverterString.allocationSize(value.`id`) + + FfiConverterString.allocationSize(value.`by`) + + FfiConverterULong.allocationSize(value.`sinceMs`) + + FfiConverterULong.allocationSize(value.`lastSeenMs`) + + FfiConverterULong.allocationSize(value.`expiresMs`) + + FfiConverterString.allocationSize(value.`peer`) + + FfiConverterString.allocationSize(value.`agent`) + ) + + override fun write(value: UniffiWebBrowser, buf: ByteBuffer) { + FfiConverterString.write(value.`id`, buf) + FfiConverterString.write(value.`by`, buf) + FfiConverterULong.write(value.`sinceMs`, buf) + FfiConverterULong.write(value.`lastSeenMs`, buf) + FfiConverterULong.write(value.`expiresMs`, buf) + FfiConverterString.write(value.`peer`, buf) + FfiConverterString.write(value.`agent`, buf) + } +} + + + /** * The code a phone sent to sign a browser in to a machine's web page, and * where that round trip stands — mirrors `client_core::stores::ui::WebSignIn` @@ -9956,6 +10036,34 @@ sealed class UniffiIntent { companion object } + /** + * Ask `machine`'s web page which browsers are signed in to it. Sent when + * the screen that lists them opens; the answer replaces this machine's + * list in `UniffiUiView.web_browsers`. + */ + data class RequestWebBrowsers( + val `machine`: kotlin.String) : UniffiIntent() + + { + + + companion object + } + + /** + * End one signed-in browser by the page id the list showed. The row goes + * at once, and the bridge's answer replaces the list with the truth. + */ + data class SignOutWebBrowser( + val `machine`: kotlin.String, + val `id`: kotlin.String) : UniffiIntent() + + { + + + companion object + } + /** * Answer a permission request with one of its options' ids. */ @@ -10631,13 +10739,20 @@ public object FfiConverterTypeUniffiIntent : FfiConverterRustBuffer UniffiIntent.ClearWebSignIn( FfiConverterString.read(buf), ) - 29 -> UniffiIntent.RespondPermission( + 29 -> UniffiIntent.RequestWebBrowsers( + FfiConverterString.read(buf), + ) + 30 -> UniffiIntent.SignOutWebBrowser( + FfiConverterString.read(buf), + FfiConverterString.read(buf), + ) + 31 -> UniffiIntent.RespondPermission( FfiConverterString.read(buf), FfiConverterString.read(buf), FfiConverterString.read(buf), FfiConverterString.read(buf), ) - 30 -> UniffiIntent.AnswerQuestion( + 32 -> UniffiIntent.AnswerQuestion( FfiConverterString.read(buf), FfiConverterString.read(buf), FfiConverterString.read(buf), @@ -10645,90 +10760,90 @@ public object FfiConverterTypeUniffiIntent : FfiConverterRustBuffer UniffiIntent.RespondPlan( + 33 -> UniffiIntent.RespondPlan( FfiConverterString.read(buf), FfiConverterString.read(buf), FfiConverterString.read(buf), FfiConverterString.read(buf), FfiConverterOptionalString.read(buf), ) - 32 -> UniffiIntent.SetOption( + 34 -> UniffiIntent.SetOption( FfiConverterString.read(buf), FfiConverterString.read(buf), FfiConverterString.read(buf), FfiConverterString.read(buf), ) - 33 -> UniffiIntent.SelectSession( + 35 -> UniffiIntent.SelectSession( FfiConverterString.read(buf), FfiConverterOptionalString.read(buf), ) - 34 -> UniffiIntent.SetPlanApprovalChoice( + 36 -> UniffiIntent.SetPlanApprovalChoice( FfiConverterString.read(buf), FfiConverterString.read(buf), ) - 35 -> UniffiIntent.RetryOutboxItem( + 37 -> UniffiIntent.RetryOutboxItem( FfiConverterString.read(buf), FfiConverterString.read(buf), ) - 36 -> UniffiIntent.DeleteSession( + 38 -> UniffiIntent.DeleteSession( FfiConverterString.read(buf), FfiConverterString.read(buf), FfiConverterOptionalString.read(buf), ) - 37 -> UniffiIntent.UndoDelete - 38 -> UniffiIntent.SetTorEnabled( + 39 -> UniffiIntent.UndoDelete + 40 -> UniffiIntent.SetTorEnabled( FfiConverterBoolean.read(buf), ) - 39 -> UniffiIntent.SetStayConnected( + 41 -> UniffiIntent.SetStayConnected( FfiConverterBoolean.read(buf), ) - 40 -> UniffiIntent.SetBlossomServer( + 42 -> UniffiIntent.SetBlossomServer( FfiConverterString.read(buf), ) - 41 -> UniffiIntent.SetNotificationsEnabled( + 43 -> UniffiIntent.SetNotificationsEnabled( FfiConverterBoolean.read(buf), ) - 42 -> UniffiIntent.SetUiScale( + 44 -> UniffiIntent.SetUiScale( FfiConverterDouble.read(buf), ) - 43 -> UniffiIntent.SetShowUsageBadge( + 45 -> UniffiIntent.SetShowUsageBadge( FfiConverterBoolean.read(buf), ) - 44 -> UniffiIntent.SetShowCommitBadge( + 46 -> UniffiIntent.SetShowCommitBadge( FfiConverterBoolean.read(buf), ) - 45 -> UniffiIntent.AddQuickPrompt( + 47 -> UniffiIntent.AddQuickPrompt( FfiConverterString.read(buf), FfiConverterString.read(buf), FfiConverterString.read(buf), ) - 46 -> UniffiIntent.UpdateQuickPrompt( + 48 -> UniffiIntent.UpdateQuickPrompt( FfiConverterString.read(buf), FfiConverterString.read(buf), FfiConverterString.read(buf), ) - 47 -> UniffiIntent.RemoveQuickPrompt( + 49 -> UniffiIntent.RemoveQuickPrompt( FfiConverterString.read(buf), ) - 48 -> UniffiIntent.DismissPendingSession( + 50 -> UniffiIntent.DismissPendingSession( FfiConverterString.read(buf), ) - 49 -> UniffiIntent.RemoveMachine( + 51 -> UniffiIntent.RemoveMachine( FfiConverterString.read(buf), ) - 50 -> UniffiIntent.SetDirectEndpoints( + 52 -> UniffiIntent.SetDirectEndpoints( FfiConverterString.read(buf), FfiConverterSequenceString.read(buf), ) - 51 -> UniffiIntent.SetMachineRelays( + 53 -> UniffiIntent.SetMachineRelays( FfiConverterString.read(buf), FfiConverterSequenceString.read(buf), ) - 52 -> UniffiIntent.SetDefaultAgent( + 54 -> UniffiIntent.SetDefaultAgent( FfiConverterString.read(buf), FfiConverterOptionalString.read(buf), ) - 53 -> UniffiIntent.SetAgentDefaults( + 55 -> UniffiIntent.SetAgentDefaults( FfiConverterString.read(buf), FfiConverterString.read(buf), FfiConverterString.read(buf), @@ -10736,66 +10851,66 @@ public object FfiConverterTypeUniffiIntent : FfiConverterRustBuffer UniffiIntent.BeginPairing( + 56 -> UniffiIntent.BeginPairing( FfiConverterString.read(buf), FfiConverterString.read(buf), ) - 55 -> UniffiIntent.BeginManualPairing( + 57 -> UniffiIntent.BeginManualPairing( FfiConverterString.read(buf), FfiConverterString.read(buf), FfiConverterString.read(buf), FfiConverterString.read(buf), ) - 56 -> UniffiIntent.StagePairing( + 58 -> UniffiIntent.StagePairing( FfiConverterString.read(buf), ) - 57 -> UniffiIntent.ConfirmStagedPairing( + 59 -> UniffiIntent.ConfirmStagedPairing( FfiConverterString.read(buf), ) - 58 -> UniffiIntent.DismissStagedPairing - 59 -> UniffiIntent.ResetPairing - 60 -> UniffiIntent.SetBackupRelay( + 60 -> UniffiIntent.DismissStagedPairing + 61 -> UniffiIntent.ResetPairing + 62 -> UniffiIntent.SetBackupRelay( FfiConverterString.read(buf), ) - 61 -> UniffiIntent.BackupNow - 62 -> UniffiIntent.DisableBackup( + 63 -> UniffiIntent.BackupNow + 64 -> UniffiIntent.DisableBackup( FfiConverterBoolean.read(buf), ) - 63 -> UniffiIntent.OpenTerminal( + 65 -> UniffiIntent.OpenTerminal( FfiConverterString.read(buf), FfiConverterOptionalString.read(buf), FfiConverterUShort.read(buf), FfiConverterUShort.read(buf), ) - 64 -> UniffiIntent.AttachTerminal( + 66 -> UniffiIntent.AttachTerminal( FfiConverterString.read(buf), FfiConverterString.read(buf), ) - 65 -> UniffiIntent.DetachTerminal( + 67 -> UniffiIntent.DetachTerminal( FfiConverterString.read(buf), ) - 66 -> UniffiIntent.TerminalInput( + 68 -> UniffiIntent.TerminalInput( FfiConverterString.read(buf), FfiConverterString.read(buf), FfiConverterByteArray.read(buf), FfiConverterBoolean.read(buf), ) - 67 -> UniffiIntent.TerminalPaste( + 69 -> UniffiIntent.TerminalPaste( FfiConverterString.read(buf), FfiConverterString.read(buf), FfiConverterByteArray.read(buf), ) - 68 -> UniffiIntent.ResizeTerminal( + 70 -> UniffiIntent.ResizeTerminal( FfiConverterString.read(buf), FfiConverterString.read(buf), FfiConverterUShort.read(buf), FfiConverterUShort.read(buf), ) - 69 -> UniffiIntent.TakeOverTerminal( + 71 -> UniffiIntent.TakeOverTerminal( FfiConverterString.read(buf), FfiConverterString.read(buf), ) - 70 -> UniffiIntent.CloseTerminal( + 72 -> UniffiIntent.CloseTerminal( FfiConverterString.read(buf), FfiConverterString.read(buf), ) @@ -11055,6 +11170,21 @@ public object FfiConverterTypeUniffiIntent : FfiConverterRustBuffer { + // Add the size for the Int that specifies the variant plus the size needed for all fields + ( + 4UL + + FfiConverterString.allocationSize(value.`machine`) + ) + } + is UniffiIntent.SignOutWebBrowser -> { + // Add the size for the Int that specifies the variant plus the size needed for all fields + ( + 4UL + + FfiConverterString.allocationSize(value.`machine`) + + FfiConverterString.allocationSize(value.`id`) + ) + } is UniffiIntent.RespondPermission -> { // Add the size for the Int that specifies the variant plus the size needed for all fields ( @@ -11594,16 +11724,27 @@ public object FfiConverterTypeUniffiIntent : FfiConverterRustBuffer { + is UniffiIntent.RequestWebBrowsers -> { buf.putInt(29) FfiConverterString.write(value.`machine`, buf) + Unit + } + is UniffiIntent.SignOutWebBrowser -> { + buf.putInt(30) + FfiConverterString.write(value.`machine`, buf) + FfiConverterString.write(value.`id`, buf) + Unit + } + is UniffiIntent.RespondPermission -> { + buf.putInt(31) + FfiConverterString.write(value.`machine`, buf) FfiConverterString.write(value.`sessionId`, buf) FfiConverterString.write(value.`requestId`, buf) FfiConverterString.write(value.`optionId`, buf) Unit } is UniffiIntent.AnswerQuestion -> { - buf.putInt(30) + buf.putInt(32) FfiConverterString.write(value.`machine`, buf) FfiConverterString.write(value.`sessionId`, buf) FfiConverterString.write(value.`requestId`, buf) @@ -11613,7 +11754,7 @@ public object FfiConverterTypeUniffiIntent : FfiConverterRustBuffer { - buf.putInt(31) + buf.putInt(33) FfiConverterString.write(value.`machine`, buf) FfiConverterString.write(value.`sessionId`, buf) FfiConverterString.write(value.`requestId`, buf) @@ -11622,7 +11763,7 @@ public object FfiConverterTypeUniffiIntent : FfiConverterRustBuffer { - buf.putInt(32) + buf.putInt(34) FfiConverterString.write(value.`machine`, buf) FfiConverterString.write(value.`sessionId`, buf) FfiConverterString.write(value.`option`, buf) @@ -11630,118 +11771,118 @@ public object FfiConverterTypeUniffiIntent : FfiConverterRustBuffer { - buf.putInt(33) + buf.putInt(35) FfiConverterString.write(value.`machine`, buf) FfiConverterOptionalString.write(value.`sessionId`, buf) Unit } is UniffiIntent.SetPlanApprovalChoice -> { - buf.putInt(34) + buf.putInt(36) FfiConverterString.write(value.`cardId`, buf) FfiConverterString.write(value.`key`, buf) Unit } is UniffiIntent.RetryOutboxItem -> { - buf.putInt(35) + buf.putInt(37) FfiConverterString.write(value.`machine`, buf) FfiConverterString.write(value.`id`, buf) Unit } is UniffiIntent.DeleteSession -> { - buf.putInt(36) + buf.putInt(38) FfiConverterString.write(value.`machine`, buf) FfiConverterString.write(value.`sessionId`, buf) FfiConverterOptionalString.write(value.`label`, buf) Unit } is UniffiIntent.UndoDelete -> { - buf.putInt(37) + buf.putInt(39) Unit } is UniffiIntent.SetTorEnabled -> { - buf.putInt(38) + buf.putInt(40) FfiConverterBoolean.write(value.`enabled`, buf) Unit } is UniffiIntent.SetStayConnected -> { - buf.putInt(39) + buf.putInt(41) FfiConverterBoolean.write(value.`enabled`, buf) Unit } is UniffiIntent.SetBlossomServer -> { - buf.putInt(40) + buf.putInt(42) FfiConverterString.write(value.`url`, buf) Unit } is UniffiIntent.SetNotificationsEnabled -> { - buf.putInt(41) + buf.putInt(43) FfiConverterBoolean.write(value.`enabled`, buf) Unit } is UniffiIntent.SetUiScale -> { - buf.putInt(42) + buf.putInt(44) FfiConverterDouble.write(value.`scale`, buf) Unit } is UniffiIntent.SetShowUsageBadge -> { - buf.putInt(43) + buf.putInt(45) FfiConverterBoolean.write(value.`enabled`, buf) Unit } is UniffiIntent.SetShowCommitBadge -> { - buf.putInt(44) + buf.putInt(46) FfiConverterBoolean.write(value.`enabled`, buf) Unit } is UniffiIntent.AddQuickPrompt -> { - buf.putInt(45) + buf.putInt(47) FfiConverterString.write(value.`id`, buf) FfiConverterString.write(value.`label`, buf) FfiConverterString.write(value.`text`, buf) Unit } is UniffiIntent.UpdateQuickPrompt -> { - buf.putInt(46) + buf.putInt(48) FfiConverterString.write(value.`id`, buf) FfiConverterString.write(value.`label`, buf) FfiConverterString.write(value.`text`, buf) Unit } is UniffiIntent.RemoveQuickPrompt -> { - buf.putInt(47) + buf.putInt(49) FfiConverterString.write(value.`id`, buf) Unit } is UniffiIntent.DismissPendingSession -> { - buf.putInt(48) + buf.putInt(50) FfiConverterString.write(value.`pendingId`, buf) Unit } is UniffiIntent.RemoveMachine -> { - buf.putInt(49) + buf.putInt(51) FfiConverterString.write(value.`pubkeyHex`, buf) Unit } is UniffiIntent.SetDirectEndpoints -> { - buf.putInt(50) + buf.putInt(52) FfiConverterString.write(value.`machine`, buf) FfiConverterSequenceString.write(value.`endpoints`, buf) Unit } is UniffiIntent.SetMachineRelays -> { - buf.putInt(51) + buf.putInt(53) FfiConverterString.write(value.`machine`, buf) FfiConverterSequenceString.write(value.`relays`, buf) Unit } is UniffiIntent.SetDefaultAgent -> { - buf.putInt(52) + buf.putInt(54) FfiConverterString.write(value.`machine`, buf) FfiConverterOptionalString.write(value.`agent`, buf) Unit } is UniffiIntent.SetAgentDefaults -> { - buf.putInt(53) + buf.putInt(55) FfiConverterString.write(value.`machine`, buf) FfiConverterString.write(value.`agent`, buf) FfiConverterString.write(value.`mode`, buf) @@ -11751,13 +11892,13 @@ public object FfiConverterTypeUniffiIntent : FfiConverterRustBuffer { - buf.putInt(54) + buf.putInt(56) FfiConverterString.write(value.`url`, buf) FfiConverterString.write(value.`label`, buf) Unit } is UniffiIntent.BeginManualPairing -> { - buf.putInt(55) + buf.putInt(57) FfiConverterString.write(value.`npub`, buf) FfiConverterString.write(value.`token`, buf) FfiConverterString.write(value.`relays`, buf) @@ -11765,39 +11906,39 @@ public object FfiConverterTypeUniffiIntent : FfiConverterRustBuffer { - buf.putInt(56) + buf.putInt(58) FfiConverterString.write(value.`url`, buf) Unit } is UniffiIntent.ConfirmStagedPairing -> { - buf.putInt(57) + buf.putInt(59) FfiConverterString.write(value.`label`, buf) Unit } is UniffiIntent.DismissStagedPairing -> { - buf.putInt(58) + buf.putInt(60) Unit } is UniffiIntent.ResetPairing -> { - buf.putInt(59) + buf.putInt(61) Unit } is UniffiIntent.SetBackupRelay -> { - buf.putInt(60) + buf.putInt(62) FfiConverterString.write(value.`url`, buf) Unit } is UniffiIntent.BackupNow -> { - buf.putInt(61) + buf.putInt(63) Unit } is UniffiIntent.DisableBackup -> { - buf.putInt(62) + buf.putInt(64) FfiConverterBoolean.write(value.`delete`, buf) Unit } is UniffiIntent.OpenTerminal -> { - buf.putInt(63) + buf.putInt(65) FfiConverterString.write(value.`machine`, buf) FfiConverterOptionalString.write(value.`session`, buf) FfiConverterUShort.write(value.`cols`, buf) @@ -11805,18 +11946,18 @@ public object FfiConverterTypeUniffiIntent : FfiConverterRustBuffer { - buf.putInt(64) + buf.putInt(66) FfiConverterString.write(value.`machine`, buf) FfiConverterString.write(value.`term`, buf) Unit } is UniffiIntent.DetachTerminal -> { - buf.putInt(65) + buf.putInt(67) FfiConverterString.write(value.`machine`, buf) Unit } is UniffiIntent.TerminalInput -> { - buf.putInt(66) + buf.putInt(68) FfiConverterString.write(value.`machine`, buf) FfiConverterString.write(value.`term`, buf) FfiConverterByteArray.write(value.`bytes`, buf) @@ -11824,14 +11965,14 @@ public object FfiConverterTypeUniffiIntent : FfiConverterRustBuffer { - buf.putInt(67) + buf.putInt(69) FfiConverterString.write(value.`machine`, buf) FfiConverterString.write(value.`term`, buf) FfiConverterByteArray.write(value.`bytes`, buf) Unit } is UniffiIntent.ResizeTerminal -> { - buf.putInt(68) + buf.putInt(70) FfiConverterString.write(value.`machine`, buf) FfiConverterString.write(value.`term`, buf) FfiConverterUShort.write(value.`cols`, buf) @@ -11839,13 +11980,13 @@ public object FfiConverterTypeUniffiIntent : FfiConverterRustBuffer { - buf.putInt(69) + buf.putInt(71) FfiConverterString.write(value.`machine`, buf) FfiConverterString.write(value.`term`, buf) Unit } is UniffiIntent.CloseTerminal -> { - buf.putInt(70) + buf.putInt(72) FfiConverterString.write(value.`machine`, buf) FfiConverterString.write(value.`term`, buf) Unit @@ -14440,6 +14581,34 @@ public object FfiConverterSequenceTypeUniffiUsageWindow: FfiConverterRustBuffer< +/** + * @suppress + */ +public object FfiConverterSequenceTypeUniffiWebBrowser: FfiConverterRustBuffer> { + override fun read(buf: ByteBuffer): List { + val len = buf.getInt() + return List(len) { + FfiConverterTypeUniffiWebBrowser.read(buf) + } + } + + override fun allocationSize(value: List): ULong { + val sizeForLength = 4UL + val sizeForItems = value.map { FfiConverterTypeUniffiWebBrowser.allocationSize(it) }.sum() + return sizeForLength + sizeForItems + } + + override fun write(value: List, buf: ByteBuffer) { + buf.putInt(value.size) + value.iterator().forEach { + FfiConverterTypeUniffiWebBrowser.write(it, buf) + } + } +} + + + + /** * @suppress */ @@ -14713,6 +14882,45 @@ public object FfiConverterMapStringSequenceTypeUniffiTerminalInfo: FfiConverterR +/** + * @suppress + */ +public object FfiConverterMapStringSequenceTypeUniffiWebBrowser: FfiConverterRustBuffer>> { + override fun read(buf: ByteBuffer): Map> { + val len = buf.getInt() + return buildMap>(len) { + repeat(len) { + val k = FfiConverterString.read(buf) + val v = FfiConverterSequenceTypeUniffiWebBrowser.read(buf) + this[k] = v + } + } + } + + override fun allocationSize(value: Map>): ULong { + val spaceForMapSize = 4UL + val spaceForChildren = value.map { (k, v) -> + FfiConverterString.allocationSize(k) + + FfiConverterSequenceTypeUniffiWebBrowser.allocationSize(v) + }.sum() + return spaceForMapSize + spaceForChildren + } + + override fun write(value: Map>, buf: ByteBuffer) { + buf.putInt(value.size) + // The parens on `(k, v)` here ensure we're calling the right method, + // which is important for compatibility with older android devices. + // Ref https://blog.danlew.net/2017/03/16/kotlin-puzzler-whose-line-is-it-anyways/ + value.forEach { (k, v) -> + FfiConverterString.write(k, buf) + FfiConverterSequenceTypeUniffiWebBrowser.write(v, buf) + } + } +} + + + + diff --git a/crates/client-core/src/stores/ui.rs b/crates/client-core/src/stores/ui.rs index 7f13c0c5..15882b4b 100644 --- a/crates/client-core/src/stores/ui.rs +++ b/crates/client-core/src/stores/ui.rs @@ -11,6 +11,7 @@ use std::collections::{BTreeMap, BTreeSet}; +use protocol::events::WebBrowserInfo; use serde::Serialize; pub use crate::notifications::session_key_of; @@ -138,6 +139,11 @@ pub struct UiState { pub provider_profile_status: BTreeMap, /// machine pubkey → the `web-sign-in` the phone last sent there. pub web_sign_in: BTreeMap, + /// machine pubkey → the browsers signed in to its web page, as the last + /// `web-browsers` listed them. Filled only while a screen asks — the phone + /// sends `web-browsers-request` when the user opens it, never on a timer — + /// so a machine nobody has looked at is simply absent. + pub web_browsers: BTreeMap>, pub undo_toast: Option, } @@ -328,11 +334,33 @@ impl UiState { pub fn clear_web_sign_in(&mut self, machine_pubkey: &str) -> bool { self.web_sign_in.remove(machine_pubkey).is_some() } + + /// The bridge's `web-browsers` for this machine: the browsers signed in + /// to its web page, as it last listed them. Replaced whole by every answer + /// — a request's list and a sign-out's fresh list are the same message — + /// so this is never merged with what was there. + pub fn set_web_browsers(&mut self, machine_pubkey: &str, browsers: Vec) { + self.web_browsers.insert(machine_pubkey.to_string(), browsers); + } + + /// Drop one browser from this machine's list the moment a sign-out is + /// sent, so the screen does not keep showing one the user ended. The + /// bridge's answer replaces the list again — with the truth, which still + /// holds the browser if the id matched nothing. Whether the id was there. + pub fn remove_web_browser(&mut self, machine_pubkey: &str, id: &str) -> bool { + let Some(browsers) = self.web_browsers.get_mut(machine_pubkey) else { + return false; + }; + let before = browsers.len(); + browsers.retain(|b| b.id != id); + browsers.len() != before + } } #[cfg(test)] mod tests { use super::*; + use protocol::events::WebBrowserInfo; #[test] fn mark_clear_is_session_unread_round_trip_keyed_per_machine_and_session() { @@ -505,6 +533,42 @@ mod tests { assert!(!ui.clear_web_sign_in("m")); } + fn a_browser() -> WebBrowserInfo { + WebBrowserInfo { + id: "0123456789abcdef".into(), + by: "npub1owner".into(), + since_ms: 1, + last_seen_ms: 2, + expires_ms: 3, + peer: "192.168.1.20".into(), + agent: "Mozilla/5.0".into(), + } + } + + #[test] + fn a_web_browsers_answer_replaces_the_whole_list_for_its_machine() { + let mut ui = UiState::default(); + let mut second = a_browser(); + second.id = "fedcba9876543210".into(); + ui.set_web_browsers("m", vec![a_browser(), second.clone()]); + assert_eq!(ui.web_browsers["m"].len(), 2); + assert!(!ui.web_browsers.contains_key("other")); + + // A later answer, even a shorter one, is the whole list — never merged. + ui.set_web_browsers("m", vec![second.clone()]); + assert_eq!(ui.web_browsers["m"], vec![second]); + } + + #[test] + fn removing_a_browser_reports_whether_the_id_was_there() { + let mut ui = UiState::default(); + assert!(!ui.remove_web_browser("m", "0123456789abcdef"), "no list at all"); + ui.set_web_browsers("m", vec![a_browser()]); + assert!(ui.remove_web_browser("m", "0123456789abcdef")); + assert!(ui.web_browsers["m"].is_empty()); + assert!(!ui.remove_web_browser("m", "0123456789abcdef"), "already gone"); + } + #[test] fn undo_toast_is_a_plain_slot() { let mut ui = UiState::default(); diff --git a/crates/client-ffi/src/intent.rs b/crates/client-ffi/src/intent.rs index 75f3b826..1c7055d4 100644 --- a/crates/client-ffi/src/intent.rs +++ b/crates/client-ffi/src/intent.rs @@ -340,6 +340,18 @@ pub enum UniffiIntent { ClearWebSignIn { machine: String, }, + /// Ask `machine`'s web page which browsers are signed in to it. Sent when + /// the screen that lists them opens; the answer replaces this machine's + /// list in `UniffiUiView.web_browsers`. + RequestWebBrowsers { + machine: String, + }, + /// End one signed-in browser by the page id the list showed. The row goes + /// at once, and the bridge's answer replaces the list with the truth. + SignOutWebBrowser { + machine: String, + id: String, + }, /// Answer a permission request with one of its options' ids. RespondPermission { machine: String, @@ -708,6 +720,14 @@ impl TryFrom for Intent { Intent::WebSignIn { machine, code } } UniffiIntent::ClearWebSignIn { machine } => Intent::ClearWebSignIn { machine }, + UniffiIntent::RequestWebBrowsers { machine } => Intent::RequestWebBrowsers { machine }, + UniffiIntent::SignOutWebBrowser { machine, id } => { + let id = id.trim().to_string(); + if id.is_empty() { + return Err(UniffiIntentError::EmptyValue { field: "id".into() }); + } + Intent::SignOutWebBrowser { machine, id } + } UniffiIntent::RespondPermission { machine, session_id, request_id, option_id } => { Intent::RespondPermission { machine, session_id, request_id, option_id } } diff --git a/crates/client-ffi/src/views.rs b/crates/client-ffi/src/views.rs index 8c87f273..e0458b65 100644 --- a/crates/client-ffi/src/views.rs +++ b/crates/client-ffi/src/views.rs @@ -1272,6 +1272,21 @@ fn to_uniffi_web_sign_in_state(state: WebSignInState) -> UniffiWebSignInState { } } +/// One browser signed in to a machine's web page — mirrors +/// `protocol::events::WebBrowserInfo` field for field. `id` is the page's +/// short public id (never the session token), and it is what a +/// `SignOutWebBrowser` intent names. +#[derive(Debug, Clone, PartialEq, Eq, uniffi::Record)] +pub struct UniffiWebBrowser { + pub id: String, + pub by: String, + pub since_ms: u64, + pub last_seen_ms: u64, + pub expires_ms: u64, + pub peer: String, + pub agent: String, +} + /// The bottom "Deleted X — Undo" toast after an optimistic session delete — /// mirrors `client_core::stores::ui::UndoToast` field for field. Present /// only while the 4 s undo window is open; the hide lands as the next @@ -1302,6 +1317,11 @@ pub struct UniffiUiView { /// to that machine's web page, and where the round trip stands. Absent /// until a sign-in screen asks, and again once it closes. pub web_sign_in: HashMap, + /// Keyed by machine pubkey: the browsers signed in to that machine's web + /// page, as the last `web-browsers` listed them. Absent for a machine + /// nobody has opened the screen for — the phone asks then, never on a + /// timer. + pub web_browsers: HashMap>, /// Present while a delete's undo window is open. pub undo_toast: Option, /// The terminals, low-frequency state only — output frames arrive on @@ -1441,6 +1461,27 @@ pub fn build_uniffi_ui_view(v: &UiView) -> UniffiUiView { ) }) .collect(), + web_browsers: v + .web_browsers + .iter() + .map(|(machine, browsers)| { + ( + machine.clone(), + browsers + .iter() + .map(|b| UniffiWebBrowser { + id: b.id.clone(), + by: b.by.clone(), + since_ms: b.since_ms, + last_seen_ms: b.last_seen_ms, + expires_ms: b.expires_ms, + peer: b.peer.clone(), + agent: b.agent.clone(), + }) + .collect(), + ) + }) + .collect(), undo_toast: v.undo_toast.clone().map(|t| UniffiUndoToast { machine: t.machine, session_id: t.session_id, diff --git a/crates/client-runtime/src/dispatch.rs b/crates/client-runtime/src/dispatch.rs index ecd30d2d..15aaa533 100644 --- a/crates/client-runtime/src/dispatch.rs +++ b/crates/client-runtime/src/dispatch.rs @@ -528,6 +528,13 @@ impl<'a> Router<'a> { r.ui_changed = true; } } + BridgeToPhone::WebBrowsers(m) => { + // The whole list, replacing whatever this machine showed: a + // request's list and a sign-out's fresh list are the same + // message, so neither is ever merged. + self.stores.ui.set_web_browsers(machine, m.browsers.clone()); + r.ui_changed = true; + } BridgeToPhone::ProviderProfileAck(m) => { self.stores.ui.apply_provider_profile_ack( machine, @@ -1638,6 +1645,34 @@ mod tests { assert!(!r.route(MACHINE, &answered).await.ui_changed); } + #[tokio::test] + async fn a_web_browsers_answer_replaces_that_machines_list_whole() { + let (mut s, ts, kp) = stores().await; + let browser = protocol::events::WebBrowserInfo { + id: "0123456789abcdef".into(), + by: "npub1owner".into(), + since_ms: 1, + last_seen_ms: 2, + expires_ms: 3, + peer: "192.168.1.20".into(), + agent: "Mozilla/5.0".into(), + }; + let message = BridgeToPhone::WebBrowsers(protocol::events::WebBrowsersMsg { + browsers: vec![browser.clone()], + }); + + let mut r = Router::new(&mut s, &ts, &kp, 1_000); + let out = r.route(MACHINE, &message).await; + assert!(out.ui_changed, "the screen redraws from the new list"); + assert_eq!(s.ui.web_browsers[MACHINE], vec![browser]); + + // A later, shorter answer is the whole list, not an addition. + let empty = BridgeToPhone::WebBrowsers(protocol::events::WebBrowsersMsg { browsers: vec![] }); + let mut r = Router::new(&mut s, &ts, &kp, 2_000); + assert!(r.route(MACHINE, &empty).await.ui_changed); + assert!(s.ui.web_browsers[MACHINE].is_empty()); + } + #[tokio::test] async fn models_updates_the_agents_list_and_asks_for_a_persist() { let (mut s, ts, kp) = stores().await; diff --git a/crates/client-runtime/src/intent.rs b/crates/client-runtime/src/intent.rs index 3c1a8f97..13cc060c 100644 --- a/crates/client-runtime/src/intent.rs +++ b/crates/client-runtime/src/intent.rs @@ -21,7 +21,7 @@ use protocol::commands::{ AccountActionMsg, AccountsRequestMsg, AgentActionMsg, BareMsg, CreateFolderMsg, CreateSessionMsg, InputMsg, McpActionMsg, McpRequestMsg, ModelsRequestMsg, PermissionResponseMsg, PermissionRulesRemoveMsg, PermissionRulesRequestMsg, PersonasRequestMsg, PhoneToBridge, PlanResponseMsg, PluginActionMsg, PluginsRequestMsg, ProviderProfileWrite, QuestionAnswer, QuestionResponseMsg, SessionIdMsg, SessionMcpToggleMsg, SetCredentialsMsg, SetOptionMsg, SetProviderProfileMsg, - StopTaskMsg, TerminalIdMsg, TerminalResizeMsg, WebSignInMsg, + StopTaskMsg, TerminalIdMsg, TerminalResizeMsg, WebBrowserSignOutMsg, WebSignInMsg, }; use protocol::common::{AccountAction, AgentAction, CredentialValues, McpAction, McpServerSpec, PluginAction, SessionOption}; use protocol::events::McpAckMsg; @@ -448,6 +448,22 @@ pub enum Intent { ClearWebSignIn { machine: String, }, + /// Ask this machine's web page which browsers are signed in to it + /// (`web-browsers-request`). Sent when the screen that lists them opens, + /// never on a timer: the page changes only when a browser signs in or out. + /// The answer, `BridgeToPhone::WebBrowsers`, replaces the ui store's list + /// for the machine. + RequestWebBrowsers { + machine: String, + }, + /// End one signed-in browser by the page id the list showed + /// (`web-browser-sign-out`). The row goes from the store at once — a + /// browser the user ended should not linger on screen — and the bridge's + /// answer replaces the list again, with the truth. + SignOutWebBrowser { + machine: String, + id: String, + }, /// Create a new project folder under a workspace root (and `git init` it, /// bridge-side). Answered with `CoreEvent::FolderAck`, matched by /// `request_id` — the caller mints it (a UUID is fine; the bridge only @@ -990,6 +1006,17 @@ pub fn apply( r.ui_changed = true; } } + Intent::RequestWebBrowsers { machine } => { + r.send(&machine, PhoneToBridge::WebBrowsersRequest(BareMsg {})); + } + Intent::SignOutWebBrowser { machine, id } => { + // Optimistic: the row goes now, and the bridge's answer — the + // fresh list — replaces it with what actually happened. + if stores.ui.remove_web_browser(&machine, &id) { + r.ui_changed = true; + } + r.send(&machine, PhoneToBridge::WebBrowserSignOut(WebBrowserSignOutMsg { id })); + } Intent::CreateFolder { machine, path, @@ -1775,6 +1802,67 @@ mod tests { assert!(!out.ui_changed); } + #[tokio::test] + async fn requesting_the_web_browsers_sends_a_bare_request() { + let (mut s, kp) = stores().await; + let out = apply( + &mut s, + Intent::RequestWebBrowsers { machine: "m".into() }, + &kp, + ctx(), + ); + assert!(matches!( + out.sends.as_slice(), + [Send { machine, msg: PhoneToBridge::WebBrowsersRequest(_) }] if machine == "m" + )); + assert!(!out.ui_changed, "nothing changed until the bridge answers"); + } + + #[tokio::test] + async fn signing_out_a_browser_sends_it_and_drops_the_row_at_once() { + let (mut s, kp) = stores().await; + s.ui.set_web_browsers("m", vec![protocol::events::WebBrowserInfo { + id: "0123456789abcdef".into(), + by: "npub1owner".into(), + since_ms: 1, + last_seen_ms: 2, + expires_ms: 3, + peer: "192.168.1.20".into(), + agent: "Mozilla/5.0".into(), + }]); + + let out = apply( + &mut s, + Intent::SignOutWebBrowser { + machine: "m".into(), + id: "0123456789abcdef".into(), + }, + &kp, + ctx(), + ); + assert!(matches!( + out.sends.as_slice(), + [Send { machine, msg: PhoneToBridge::WebBrowserSignOut(m) }] + if machine == "m" && m.id == "0123456789abcdef" + )); + assert!(out.ui_changed, "the row left before the answer"); + assert!(s.ui.web_browsers["m"].is_empty()); + + // An id the list no longer holds still goes to the bridge — its + // answer is what the screen trusts — but moves nothing here. + let out = apply( + &mut s, + Intent::SignOutWebBrowser { + machine: "m".into(), + id: "0123456789abcdef".into(), + }, + &kp, + ctx(), + ); + assert_eq!(out.sends.len(), 1); + assert!(!out.ui_changed); + } + /// Screens ask each time they open; the profiles, which the bridge /// pushes on every change, are not asked for twice. #[tokio::test] diff --git a/crates/client-runtime/src/runtime.rs b/crates/client-runtime/src/runtime.rs index d804085c..61b85492 100644 --- a/crates/client-runtime/src/runtime.rs +++ b/crates/client-runtime/src/runtime.rs @@ -711,6 +711,7 @@ impl Core { credentials_status: Default::default(), provider_profile_status: Default::default(), web_sign_in: Default::default(), + web_browsers: Default::default(), undo_toast: None, terminals: Default::default(), }) diff --git a/crates/client-runtime/src/view.rs b/crates/client-runtime/src/view.rs index 4a3e94e6..b5542624 100644 --- a/crates/client-runtime/src/view.rs +++ b/crates/client-runtime/src/view.rs @@ -24,7 +24,7 @@ use client_core::stores::settings::SettingsData; use client_core::stores::transcript::{SyncState, TranscriptState}; use client_core::stores::ui::{CredentialsAck, ProviderProfileAck, UndoToast, WebSignIn}; use protocol::common::{AgentStyle, TerminalEndReason}; -use protocol::events::TerminalInfo; +use protocol::events::{TerminalInfo, WebBrowserInfo}; use serde::Serialize; use crate::ports::TranscriptStore; @@ -205,6 +205,10 @@ pub struct UiView { /// machine pubkey → the code the phone sent to sign a browser in to that /// machine's web page, and where the round trip stands. pub web_sign_in: BTreeMap, + /// machine pubkey → the browsers signed in to its web page, as the last + /// `web-browsers` listed them. Absent for a machine nobody has opened the + /// screen for: the phone asks then, never on a timer. + pub web_browsers: BTreeMap>, pub undo_toast: Option, /// The terminals, low-frequency state only: the frames themselves go to /// the host on `CoreEvent::TerminalOutput`, never through a view. @@ -296,6 +300,7 @@ impl UiView { credentials_status: ui.credentials_status.clone(), provider_profile_status: ui.provider_profile_status.clone(), web_sign_in: ui.web_sign_in.clone(), + web_browsers: ui.web_browsers.clone(), undo_toast: ui.undo_toast.clone(), terminals: TerminalsView::from_stores(s), } From 5d3a4bde2fc4ea825a9dcb569cf9b51ddcd7f3bd Mon Sep 17 00:00:00 2001 From: deymosh <232244450+deymosh@users.noreply.github.com> Date: Sat, 17 Oct 2026 18:18:30 +0200 Subject: [PATCH 27/30] docs: the phone's web page browser list PROTOCOL.md gains the three messages in the web page sign-in section, with the request's send-on-open rule and what each field of a browser entry is; BRIDGE.md and CLIENT.md say in one place each that the phone reads and ends the page's browsers through the same list the page's own APIs serve. Co-Authored-By: Claude Code --- docs/BRIDGE.md | 7 +++++-- docs/CLIENT.md | 6 ++++++ docs/PROTOCOL.md | 25 +++++++++++++++++++++++-- 3 files changed, 34 insertions(+), 4 deletions(-) diff --git a/docs/BRIDGE.md b/docs/BRIDGE.md index ef38c761..ad1df405 100644 --- a/docs/BRIDGE.md +++ b/docs/BRIDGE.md @@ -245,8 +245,11 @@ sessions — and never a secret. Signed in, the page also has a few JSON APIs: `GET /api/browsers` lists the signed-in browsers (each with its id, approver, sign-in and last-seen times, expiry, address and User-Agent, and which is the caller) and -`POST /api/browsers/sign-out` ends one; `GET /api/devices` shows the paired -identities and their clients (labels and key expiries, never a key); +`POST /api/browsers/sign-out` ends one — the same list a paired phone reads +with `web-browsers-request` and ends one of with `web-browser-sign-out`, both +served from one place so the two paths never disagree; `GET /api/devices` +shows the paired identities and their clients (labels and key expiries, never +a key); `GET /api/config` shows the config as it is in effect (a secret only as set/not set, and each field whether a flag or environment variable overrides the file) and `POST /api/config` changes the safe set — the machine name, diff --git a/docs/CLIENT.md b/docs/CLIENT.md index f6b32dd6..0bbe1be1 100644 --- a/docs/CLIENT.md +++ b/docs/CLIENT.md @@ -423,6 +423,12 @@ anything is sent. The QR has no deep link on purpose: a link opened elsewhere must not sign a browser in without the user on this page. Closing the page dispatches `ClearWebSignIn`, so a late answer is dropped. +The same group lists the browsers already signed in to the page: opening it +dispatches `RequestWebBrowsers`, and the bridge's `web-browsers` answer fills +the UI view's `webBrowsers` (by machine). Ending one dispatches +`SignOutWebBrowser`, which drops the row at once and lets the bridge's fresh +list — the same message a request is answered with — confirm it. + ## Conventions - A UniFFI error variant must not have a field named `message` (it collides diff --git a/docs/PROTOCOL.md b/docs/PROTOCOL.md index eef9fd56..c207df06 100644 --- a/docs/PROTOCOL.md +++ b/docs/PROTOCOL.md @@ -785,8 +785,29 @@ characters (`ABCD-EFGH`, from an alphabet without look-alikes) and a QR of - A phone sends a scanned code only to the machine its QR names: a code shown by one bridge must never sign in another's page. -Cost: two small command-class events per sign-in, nothing while no one -signs in. +The phone can also see and end the browsers already signed in, the same thing +the page's own `GET /api/browsers` and `POST /api/browsers/sign-out` do: + +- `web-browsers-request {}` (phone → bridge, a signed command like any + other). No fields. Sent when the user opens the screen that lists them, + never on a timer: the list changes only when a browser signs in or out, so + nothing else would make it stale. +- `web-browsers {browsers}` to the asking client. Each entry is `{id, by, + sinceMs, lastSeenMs, expiresMs, peer, agent}`: `id` is the page's short + public id — the first 16 hex characters of the stored key's SHA-256, never + the key and never the session token — `by` is the npub that signed it in, + the three times are ms since the Unix epoch, `peer` the address it came + from and `agent` its `User-Agent` (cleaned and bounded). Oldest signed in + first; empty when the bridge runs no web page. +- `web-browser-sign-out {id}` (phone → bridge). Ends the browser whose page + id is `id`; any paired client may end any of the owner's browsers. Answered + with `web-browsers`, the fresh list — a sign-out is confirmed by the list it + produced, and an id that matched nothing is answered with the list as it is, + not an error. + +Cost: two small command-class events per sign-in, one request and one response +per screen opening, and the same again per sign-out; nothing while the screen +is closed. ### Version and capabilities From a450c763d4314a79dab98c2233bf01cd0d2b1db3 Mon Sep 17 00:00:00 2001 From: deymosh <232244450+deymosh@users.noreply.github.com> Date: Sat, 17 Oct 2026 18:23:23 +0200 Subject: [PATCH 28/30] feat(android): the Browsers page lists the signed-in browsers and signs one out The machine's "Sign in a browser" page becomes "Browsers": signing a browser in as before, then the browsers signed in now, each named as the web page names it ("Firefox on Linux"), with its address, when it was last seen and, when another identity signed it in, which one. Sign out asks first, as the page does. The list is asked for when the page opens and again after a sign-in from it, never polled. Co-Authored-By: Claude Code --- .../plus/ui/screens/MachineWebPage.kt | 92 +++++++++++++++++- .../codedeck/plus/ui/DesignSnapshotTest.kt | 23 ++++- ...nFullPageSnapshotTest_settings_machine.png | Bin 47665 -> 47234 bytes ...DesignFullPageSnapshotTest_web_sign_in.png | Bin 0 -> 17773 bytes ...plus.ui_DesignSnapshotTest_web_sign_in.png | Bin 34954 -> 60809 bytes ..._DesignSnapshotTest_web_sign_in_asking.png | Bin 0 -> 47010 bytes ...ui_DesignSnapshotTest_web_sign_in_none.png | Bin 0 -> 47421 bytes ...gnSnapshotTest_web_sign_in_not_matched.png | Bin 47995 -> 61321 bytes ...DesignSnapshotTest_web_sign_in_sending.png | Bin 33669 -> 59314 bytes ...signSnapshotTest_web_sign_in_signed_in.png | Bin 33981 -> 31992 bytes 10 files changed, 110 insertions(+), 5 deletions(-) create mode 100644 apps/android/app/src/test/snapshots/images/com.codedeck.plus.ui_DesignFullPageSnapshotTest_web_sign_in.png create mode 100644 apps/android/app/src/test/snapshots/images/com.codedeck.plus.ui_DesignSnapshotTest_web_sign_in_asking.png create mode 100644 apps/android/app/src/test/snapshots/images/com.codedeck.plus.ui_DesignSnapshotTest_web_sign_in_none.png diff --git a/apps/android/app/src/main/java/com/codedeck/plus/ui/screens/MachineWebPage.kt b/apps/android/app/src/main/java/com/codedeck/plus/ui/screens/MachineWebPage.kt index ebed5e70..29fc51d8 100644 --- a/apps/android/app/src/main/java/com/codedeck/plus/ui/screens/MachineWebPage.kt +++ b/apps/android/app/src/main/java/com/codedeck/plus/ui/screens/MachineWebPage.kt @@ -13,6 +13,7 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.outlined.Logout import androidx.compose.material.icons.outlined.Check import androidx.compose.material.icons.outlined.ContentCopy import androidx.compose.material.icons.outlined.QrCodeScanner @@ -38,6 +39,7 @@ import androidx.compose.ui.text.input.KeyboardCapitalization import androidx.compose.ui.text.style.TextOverflow import androidx.core.content.ContextCompat import com.codedeck.plus.core.CoreHost +import com.codedeck.plus.ui.components.ConfirmDialog import com.codedeck.plus.ui.components.EmptyState import com.codedeck.plus.ui.components.ErrorNote import com.codedeck.plus.ui.components.Field @@ -49,11 +51,13 @@ import com.codedeck.plus.ui.components.Page import com.codedeck.plus.ui.components.PrimaryButton import com.codedeck.plus.ui.components.RowSpinner import com.codedeck.plus.ui.components.SecondaryButton +import com.codedeck.plus.ui.components.ValueRow import com.codedeck.plus.ui.theme.Tokens import kotlinx.coroutines.delay import kotlinx.coroutines.launch import uniffi.client_ffi.UniffiIntent import uniffi.client_ffi.UniffiMachineSummary +import uniffi.client_ffi.UniffiWebBrowser import uniffi.client_ffi.UniffiWebSignIn import uniffi.client_ffi.UniffiWebSignInState @@ -100,7 +104,7 @@ internal fun readSignInQr(text: String, machineNpub: String): ScannedSignIn { /** * The "Web page" group on a machine's page: the addresses its web page is * served on (each copies, in full with its https://), and the row that opens - * [WebSignInContent]. + * [WebSignInContent]: signing a browser in, and the ones signed in. */ @Composable internal fun MachineWebPageGroup(machine: UniffiMachineSummary, onOpenWebSignIn: () -> Unit) { @@ -139,7 +143,7 @@ internal fun MachineWebPageGroup(machine: UniffiMachineSummary, onOpenWebSignIn: } Divider() } - NavRow("Sign in a browser", onClick = onOpenWebSignIn) + NavRow("Browsers", onClick = onOpenWebSignIn, subtitle = "Sign one in, or out") } } @@ -151,6 +155,9 @@ internal fun MachineWebPageGroup(machine: UniffiMachineSummary, onOpenWebSignIn: * * [signIn] is the code this phone sent and the bridge's answer; [noAnswer] * that the answer did not come in time; [notice] what was wrong with a scan. + * Under that, the browsers signed in now ([browsers], null until the bridge + * answers), each signed out with [onSignOut] after a confirmation; + * [ownNpub] is this phone's identity, which a row does not repeat. */ @Composable fun WebSignInContent( @@ -161,9 +168,14 @@ fun WebSignInContent( onCodeChange: (String) -> Unit, onSend: (String) -> Unit, onScan: () -> Unit, + browsers: List?, + ownNpub: String, + now: Long, + onSignOut: (UniffiWebBrowser) -> Unit, onBack: () -> Unit, ) { - Page(title = "Sign in a browser", onBack = onBack) { + var confirming by remember { mutableStateOf(null) } + Page(title = "Browsers", onBack = onBack) { if (signIn?.state == UniffiWebSignInState.SIGNED_IN) { EmptyState( icon = Icons.Outlined.Check, @@ -208,6 +220,69 @@ fun WebSignInContent( } } } + SignedInBrowsers(browsers, ownNpub, now, onSignOut = { confirming = it }) + } + confirming?.let { browser -> + ConfirmDialog( + title = "Sign out ${browserName(browser.agent)}?", + body = "The browser at ${browser.peer} sees only the sign-in page again, until a phone signs it in.", + confirm = "Sign out", + onConfirm = { + onSignOut(browser) + confirming = null + }, + onDismiss = { confirming = null }, + ) + } +} + +/** "Firefox on Windows" from a User-Agent, as the web page names it, or the string itself. */ +internal fun browserName(agent: String): String { + if (agent.isBlank()) return "A browser" + val name = when { + "Edg/" in agent -> "Edge" + "OPR/" in agent -> "Opera" + "Firefox/" in agent -> "Firefox" + "Chrome/" in agent -> "Chrome" + "Safari/" in agent -> "Safari" + else -> return agent + } + val os = when { + "Android" in agent -> "Android" + "iPhone" in agent || "iPad" in agent -> "iOS" + "Windows" in agent -> "Windows" + "Mac OS X" in agent -> "macOS" + "Linux" in agent -> "Linux" + else -> return name + } + return "$name on $os" +} + +private fun ago(ms: Long, now: Long): String { + val minutes = (now - ms).coerceAtLeast(0) / 60_000 + return when { + minutes < 1 -> "just now" + minutes < 60 -> "$minutes min ago" + minutes < 48 * 60 -> "${minutes / 60} h ago" + else -> "${minutes / (24 * 60)} days ago" + } +} + +/** The browsers signed in to the page now, each with where it is, when it was last seen, and Sign out. */ +@Composable +private fun SignedInBrowsers(browsers: List?, ownNpub: String, now: Long, onSignOut: (UniffiWebBrowser) -> Unit) { + Group(title = "Signed in", footer = "A browser stays signed in for 30 days after its sign-in.") { + when { + browsers == null -> ValueRow("Asking the bridge") { RowSpinner() } + browsers.isEmpty() -> ValueRow("No browser is signed in") {} + else -> browsers.forEachIndexed { i, b -> + if (i > 0) Divider() + val by = b.by.takeIf { it != ownNpub }?.let { " · by ${shortKey(it)}" }.orEmpty() + ValueRow(browserName(b.agent), subtitle = "${b.peer} · seen ${ago(b.lastSeenMs.toLong(), now)}$by") { + IconAction(Icons.AutoMirrored.Outlined.Logout, "Sign out ${browserName(b.agent)}", onClick = { onSignOut(b) }, tint = Tokens.TextMuted) + } + } + } } } @@ -223,6 +298,13 @@ fun WebSignInScreen(core: CoreHost, pubkey: String, onBack: () -> Unit) { val context = LocalContext.current val machine = machineOrLeave(core, pubkey, onGone = onBack) ?: return val signIn = ui?.webSignIn?.get(pubkey) + val browsers = ui?.webBrowsers?.get(pubkey) + val ownNpub = remember { runCatching { core.identityNpub() }.getOrDefault("") } + // Asked once when the page opens, and again once a browser signs in from + // here: the list changes only then, so it is never polled. + LaunchedEffect(pubkey, signIn?.state == UniffiWebSignInState.SIGNED_IN) { + core.dispatch(UniffiIntent.RequestWebBrowsers(pubkey)) + } var code by rememberSaveable { mutableStateOf("") } var notice by remember { mutableStateOf(null) } var noAnswer by remember { mutableStateOf(false) } @@ -270,6 +352,10 @@ fun WebSignInScreen(core: CoreHost, pubkey: String, onBack: () -> Unit) { cameraPermission.launch(Manifest.permission.CAMERA) } }, + browsers = browsers, + ownNpub = ownNpub, + now = System.currentTimeMillis(), + onSignOut = { b -> scope.launch { core.dispatch(UniffiIntent.SignOutWebBrowser(pubkey, b.id)) } }, onBack = onBack, ) if (scanOpen) { diff --git a/apps/android/app/src/test/java/com/codedeck/plus/ui/DesignSnapshotTest.kt b/apps/android/app/src/test/java/com/codedeck/plus/ui/DesignSnapshotTest.kt index 2d0d16cf..d63b6543 100644 --- a/apps/android/app/src/test/java/com/codedeck/plus/ui/DesignSnapshotTest.kt +++ b/apps/android/app/src/test/java/com/codedeck/plus/ui/DesignSnapshotTest.kt @@ -51,6 +51,7 @@ import uniffi.client_ffi.UniffiAttachedTerminal import uniffi.client_ffi.UniffiTerminalEnded import uniffi.client_ffi.UniffiTerminalInfo import uniffi.client_ffi.UniffiTerminalRefusal +import uniffi.client_ffi.UniffiWebBrowser import uniffi.client_ffi.UniffiWebSignIn import uniffi.client_ffi.UniffiWebSignInState import uniffi.client_ffi.UniffiUsageData @@ -333,6 +334,8 @@ private val pages: Map Unit> = linkedMapOf( } }, "web_sign_in" to { WebSignIn(signIn = null, code = "") }, + "web_sign_in_asking" to { WebSignIn(signIn = null, code = "", browsers = null) }, + "web_sign_in_none" to { WebSignIn(signIn = null, code = "", browsers = emptyList()) }, "web_sign_in_sending" to { WebSignIn(UniffiWebSignIn("K7QM-4XTR", UniffiWebSignInState.SENDING), code = "K7QM-4XTR") }, "web_sign_in_not_matched" to { WebSignIn(UniffiWebSignIn("K7QM-4XTR", UniffiWebSignInState.NOT_MATCHED), code = "K7QM-4XTR") }, "web_sign_in_signed_in" to { WebSignIn(UniffiWebSignIn("K7QM-4XTR", UniffiWebSignInState.SIGNED_IN), code = "K7QM-4XTR") }, @@ -479,8 +482,21 @@ private fun AgentPage(agent: String) = AgentSettingsContent( /** Signing a browser in to the workstation's web page. */ @Composable -private fun WebSignIn(signIn: UniffiWebSignIn?, code: String) = WebSignInContent( - signIn = signIn, noAnswer = false, notice = null, code = code, onCodeChange = {}, onSend = {}, onScan = {}, onBack = {}, +private fun WebSignIn(signIn: UniffiWebSignIn?, code: String, browsers: List? = signedInBrowsers) = WebSignInContent( + signIn = signIn, noAnswer = false, notice = null, code = code, onCodeChange = {}, onSend = {}, onScan = {}, + browsers = browsers, ownNpub = workstation.npub, now = NOW, onSignOut = {}, onBack = {}, +) + +/** Two browsers on the workstation's page: one this identity signed in, one another identity did. */ +private val signedInBrowsers = listOf( + UniffiWebBrowser( + "0123456789abcdef", workstation.npub, (NOW - 3 * 86_400_000).toULong(), (NOW - 4 * 60_000).toULong(), (NOW + 27 * 86_400_000).toULong(), + "192.168.1.20", "Mozilla/5.0 (X11; Linux x86_64; rv:131.0) Gecko/20100101 Firefox/131.0", + ), + UniffiWebBrowser( + "fedcba9876543210", "npub1q8zy7gyw0l9fh2qkj6x4wlcw5h6xyq9d0k3e8w2yv3m5l6n7p8r9s0tuvx", (NOW - 86_400_000).toULong(), (NOW - 2 * 3_600_000).toULong(), + (NOW + 29 * 86_400_000).toULong(), "10.8.0.6", "Mozilla/5.0 (Macintosh; Intel Mac OS X 14_5) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Safari/605.1.15", + ), ) @Composable @@ -554,6 +570,8 @@ class DesignSnapshotTest { @Test fun session_options_terminal() = paparazzi.page("session_options_terminal") @Test fun machine_terminals() = paparazzi.page("machine_terminals") @Test fun web_sign_in() = paparazzi.page("web_sign_in") + @Test fun web_sign_in_asking() = paparazzi.page("web_sign_in_asking") + @Test fun web_sign_in_none() = paparazzi.page("web_sign_in_none") @Test fun web_sign_in_sending() = paparazzi.page("web_sign_in_sending") @Test fun web_sign_in_not_matched() = paparazzi.page("web_sign_in_not_matched") @Test fun web_sign_in_signed_in() = paparazzi.page("web_sign_in_signed_in") @@ -607,4 +625,5 @@ class DesignFullPageSnapshotTest { @Test fun settings_machine() = paparazzi.page("settings_machine") @Test fun plugins() = paparazzi.page("plugins") @Test fun settings_messages() = paparazzi.page("settings_messages") + @Test fun web_sign_in() = paparazzi.page("web_sign_in") } diff --git a/apps/android/app/src/test/snapshots/images/com.codedeck.plus.ui_DesignFullPageSnapshotTest_settings_machine.png b/apps/android/app/src/test/snapshots/images/com.codedeck.plus.ui_DesignFullPageSnapshotTest_settings_machine.png index 5cf4e05d5df4e5398c55070d48d9faed8d258c38..bfa3b7eeed7dc31b9a1ef3a17fb1b66673b6c9e7 100644 GIT binary patch delta 20754 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 delta 21238 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

8{J@mbeG^cf11&{|T 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

lT?{;kNzLlm$-iryl5o{V_EyGF66O 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 HlaT)gaR7*H literal 0 HcmV?d00001 diff --git a/apps/android/app/src/test/snapshots/images/com.codedeck.plus.ui_DesignSnapshotTest_web_sign_in_none.png b/apps/android/app/src/test/snapshots/images/com.codedeck.plus.ui_DesignSnapshotTest_web_sign_in_none.png new file mode 100644 index 0000000000000000000000000000000000000000..9f5501b3c568595c0a99cf8fcaa55ac9eead9431 GIT binary patch literal 47421 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 literal 0 HcmV?d00001 diff --git a/apps/android/app/src/test/snapshots/images/com.codedeck.plus.ui_DesignSnapshotTest_web_sign_in_not_matched.png b/apps/android/app/src/test/snapshots/images/com.codedeck.plus.ui_DesignSnapshotTest_web_sign_in_not_matched.png index ed518fdb9df81a31b92c659dda4f3a93e5072083..254bbf4d2e10e184d7290a9030074e4de4ab4e22 100644 GIT binary patch literal 61321 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

-{u_Y1bzl!l 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

d%vc zhdS@J5}_YKwS|lE-&h*)h9AgS3cgSbu-a$(xXQZ3y;dcIcc)+30sa_!g{L4)1;jky zWP^vAub)&~4ER@rH%!2+#}$ATWJ(D2G&nSPszUoYNQJ?iY+{eSB4CMkpMyi{+FHkk zUfdhk6HL3{!CTAI^6<<6JyidAlWL$z@jDRFfy077fF=Nc{#&`)|9&fqkNcnd-faE9 zU76z#QQ=!DD0ZF$GE_Ie^J5pr_p=h;z`}u-n_u^LpahB>aD8su0?0%^W8eEIuh1|8?fms+7%|Ra?vm{#D4tvfgK`f z$^oVa@56P7B5TVz_<*37CFjlET5|yi1pS%l*VNwbZUMlDear!$@y7Z7o_abp0E{Bk z(IftVjILfXh=2fmvfoBoXfBW}l6FTb*Ur9}>&x@!SYUL&Ud0K&$a7J2g+X#Y5PWz2 zkc&#=(0CaunTQ@>3t?lGj^;{n7fQ-A5^t24&kMbWcLlX=W)uNudUw zAV04ka_ch)a|dBkJoe1-&zJPQ_Q3~iL0g}6&S6__+w_oAdG z%G2ftwo_msZ3F7U!VhIl(?Pbi%?YyTYsoiZkK1v

vg%MGzA~%Im45;7mz5+Erxn zsI8urgvc#>7W$VA-XZ;2K(CBN1Xv8T%3BoJ%=IkiGdnk8N!|$@4*qvQ_d5#~0aW!H zP=R||fplXf?q6016xF?E7Hjlo^jhlbwZQ17a^s9jNXTpFXN&X>@Doo(VWSjlnI7WN zO?Sftm9s>@lMp}BL(l#L`}ZrsqjA)9Y9z@S8NdhWq*3;(dEfM)S5+15914^#v9#8q4k5@O%t-F9|5ws^= zz@M#dzRY|w!;(#np8ewH=SpQzy#yVc-oi^0p`hgD`ci`DNAvj{&8^VWH7@NsSMBwN zcv`u7Agkd!X~Cqa1)?!zj}jHXZOu7Az^qmpH$F$FFv2(xPt^v|DXtp>`#O|b}kq)MU3HZi%LuF zsvJ8GfAdHiK)k!dArMsI<>C5QFdWyHyOXWV19Xj!d)oCcJ|vz^O4B))M1iWBqbrSW z*f7x}wM9G9=dRq(hT1~|ny;eWqDu3>ggZZ4j#jk~UJFNPG>wiPVw7!i*c4yR^YF_t z$%yMpQxolyH=eH>?&^ujxiqkWy8ZYS#F0T`-F^?5(mMa>Gvm3kuWRko_-Kw>e`G$S zUnW!8SHnR2WPhO1eP{Z)7M5G-8tiki&p3H-Z{xz6sdes60<(l>>s z2(&l$$6F(9_ueFM18v+os*Tt573y(-E_?p1J0yU21#>2#z`wF$He{&|wOBZuR_GDplDgFqmdzje?qdw(&frJdg!FA+H@z zW?dX6l~Pqtfd;kG1au1a*s2qL7M^x?4ysTqvno7d?hK-OFHbb?cd$We3v58A3w@;i z2|H*apx(HC0VLe@Ak61Ev;_jb?h32(2$G@=>~L@|h1D&}n$FVci?2=x0^A&$PCe>l zj>Rta@}SZgOpvcAncEslwk9T-y=l4NGI06L4{&4rQnE*&;`93Jw)cQH|Fw|fH;u+k zswf(XocT-pI;*10bI?$3#LV104CRV+iM$kOKDC=9m{&+-m^pGSi)610j-^7QyZ2w% z*fVjjC-o127s7_$K&Hq*16oK(iv=?X%-dMongXupN^5H9Ob46)e&?8~1=P{Cc2{eF zJ~lqbyF~#(YVJdh#zPC9al_M|ij<4OZJ_3O~l8Gxvo?HnY{D9c2?|gu+6;@rPgd<0d;hLuTBD9!4#$P3M?(N z@9!e(lAtl7Wo+=^tVQ4+T?yA3cmaAqN>unQT<)Ccz~Sq)Vov!G+UZZ12cDK0z>oo= z4%QL~q`VD?T@YC0g`jup?Dnh|%6+`~`)aV|XG9#XNP47YZ%PT&gq)ceB%CJHIOKbU zFI4P++}#bdxfHH1mBPw;wXbUMrWIFG`a~~{Qtv#=^OphMu(MBYcxi<|Su>?QC9B+m8RsokA%BS}FV7dwZb=rP@wbmc!H zCa%Hw;>vSd?rLNBoRpt)5z!H=$y_~O;l1%Sv=IoRdyborrzwp>Cy5|n>W$5P_T>n) za_u@sQBQ!ef-OX<`dPo<&=SG}O5FC__z%Bc9xxMqPN0SZpYkAWjZdZ2I+u#<*3C0gi_#eH>6Dw+^0*l4& z_O#+z)NHf;++FvkW2L8{7hbu78#8U8!5^SoZi{|M-k4v!n21xfPJJb8Cl6nrN(#%q zL@8CDgCD^FBG1La=P)TyzhERPdH#dP5U1A)9h{Ww;5&pR%(yGgSg9+q^9eONJ#~li z$&Og`0|<^}*K3x0xktRlVw+&H3rton-M19;r#G{{rn%aa!Omo%OvF4+O568t?*(!kXIl*R#WlucAU)Z!7P^ zLF3AWEg@iqPT|s_6z#7%l}kmt#DpK*Ku0JRiL>q&;}$p>%}lB1&?$dN!i1VA_4xw;(cdW(@EpnR^5bQfb{4e z`lrh!aXFE!e}I4WmX|s{#dP7hrKcHdtW?801W*6Vhev6kFLb)9+JU8s3v9Xqp(>)5 zc|(a~6Fsv^09+AD4UZe$@fVB~Bex=>I^Ultqy!sSl8#(mV%lBD_^{i(Qq3lOkE3844-273@9bjEKJ%$St#^5Mn3g@i6^BP zD)&3@TkTeDk_FZjz?)!Bb3k(9s=eS3oK6ZZuim}hA+^h`29w(DCVHkAp{_fW&T{6_ z8IzeqHv(k8XA>WEuPjp52Ytr)@sgt-Qr|;8w>vN?F-N>NNpXWt+@HZRi<_|^SwW-7 z)TIkyCI)S%^tCETamWusRUq%^T#s~Qqwo0M}oj%`5v}8OnOUn-m z86UEALeuljjyCvm1e>xzKjHvtiuhdN5k35`=EYBg5pf028#|`-S=RiTg{X*H(ydy;e8)tdKfO=C(s&pKYQhq7d7_>x;@IGa3vFq zJsG&`EeQ1X(F%tIvoA7^=QjA&+cDI@^O{UOt) zmTgHyR~55q121#ZF-qO6koc@SGPjCq`R*WV`q|0VIn9@b*OoRGU4x(dlVTyYDg)j? zQagEN)=MEFEGez&_DuAm!*lHO7*g3FP#!clqw<(;0s-b&eQJZ)^vT-+Uw&StdEX53vzsM5`1hA>n)TY#?u^E1r?^JFxutuS%hN?iCgTd`s3ebM{ z287_XH+TmuD|P_LyFXazYVfdJkoyKp+59$X% zW&jsglT+!JO{az zd$}releFtVzdnzA2srl*RpXBj4z0_mZyfWUutXrHr`3>8Yf4>!Nk^p({*6dCn?xoU zgpA=Ljz9fzZ8)ch|3Na*vaNuk!uixFdxJ6Mx&$G>z4~ueTqux$4v)v89{_{hxnMSE z0iFvXc-$8KQvcMyufEVrTfa0n$uDnOO{WB!U&JI)=shYOLV?>Jz+g}7104px5G zrs(Nl10e9{&l{jr(^AX8UCd>S0wKnOX$W>8R}Asic2&j@QsPO z`}(RqO8KYLPuQ5qj8Bvm6xPI^WaRCR&(=oH&Nq702Vv4g^@ie2pvJ-CJ%ITGW1A&_ zp8c|~SzN`qr=J2q&W9cVi<$)pzU{34xn#BHzBa=X*xm4$xr#M=k)6H8u-P1GIa{4k zrzHmdeX|GC7u#BTU%ThrXPRncbvoa>jpKOqviZz5`JJE;L!k{Jpm=xFt==i83GHEY z-)Wdre#_mcu#(6*%%ktQh*9lxqW@_t!`a`=OgVeL8nb8rb+Y7<8_J|*V{8+^teT@s z4h{P$sg?y}kI^6Um4u4RSY3Vc-2Vlbb=Rz3Mu z7rDjB<_uW6j#W4c zyi{}t#6&~}7~!FB7n4b8`Hm9jo9 zhnq;d`YK6CjsXbC4NW_ITLS6Xd3Z!ttLRzP?~B#9(#;=FRe*2Ce?jcFFk>g}@_T?f zFU)(VrXIgPYVm2qJv(dxG}?*;0?Vl_2ST_%I`;AZ+Uj zfrWw`Yb&6Xr!lZUUtzXldjABduzXoM!KBrOoEVJ~w*D~SkYuAX zur+71Jsp|O3hNhKdRlGLIsaq|;HUC**@xol`18ju{n~c9w8JE&ODmF7mA^Zlcn#}R zW`6keX+|CCJwOfRT zo`k7aCp7rs0~$r+bv9*l*3>Lx&7z@08-_4lvaI= zo5m=d{Ae6-uxntQ$qB#fcStLddsb8Q@a)yu-7rxy?%}gRfhu2+NqzPh)A+EiX8f_0 zC}QTkm;H9ZEFpPDmkl$QVj#SumVQQdFH_7q)WD1ROe^qt;P>}7Fm&jCwuu=WDY2j~dH>)e@ft~iU(0NBGok(2 znp&wHaVgxPgC~*Z*=(MSrRkA|TYBMYEF46DsueR$%@9yoi)W~&wyV4{c;x0##WPm2 zQ)VZ;5TFwBgIH>$>c|&>0*U%sCoi};Wie5U0EP_Q%&f$354iT!%wui?24Sj`Pp6E< z`9r7_!zfeRG-Zf4V?eJs9 zB-Q?U#iDn&dxR_oALAxH5mI6b`o@3Xl(XZGi7ht+8Tzd#^hD(pujVn46LRa{zqjB1 z*578w5~JBsntq$Lv$2sbtdgnvBL7*8mx?FNQn#Og{VcBxeDC3J!+Y#&D?Cw{Sz5Dj z&1n@~&ew;M3Nr1vGQE8)QX+e+r%m71D|FUomwOL41-==qi4e)bIo*B9VtVj`VX&xo z*{@!5&ZV{NB{D^5joWL=R*$y7TGm ze$c_vCLMc+?=zS-Kd3{Vz1nN#kEUC$+OeU@_QF_v565 zi#GI_e@_E_nOV!jvF@R7)6p=@JkHvDRp1o+B9n-i)b@Fh{GP%mGE2?n!ilmp0{F<5 zcX0c~CfV~2DZwb|Kz0_RR#8bv%hyFyt=ZjoslHi)eo9UE*7gVTKfr+2VRR$YG^?is zn~O_8reN6cp~@s}4C3_{E(X{3mwP#_PnR%ERGQ?z;EATS&Zz^GW$d z=i}Cpi6EHqx7X0)IWl2a(|DU--O^F6JG086a`M2Y>jNpId%3X**=q6q`-b)R2)>jH zK-3szumUY^7QYAD#N$Lf5^8!jX>emW^_ui}8d^I-qK#mol)QlmnC8yY7%~n9rJeWP zfM-{M!sH)`IsQzm?Y1)cdui5-!ySR8894=qS6TCwaMUc=4&1`WXK^^gACi1_55~zV z&go1>5k<0gzubAno06us)(^My_OIyk?18{e&}g))l+U8S6$XRp4e|J2d}#k_QQ`f~ z_b<+X9H;v8=a3dpoHfP0*|t+Dy)bcT7`P|d0d3GHJ7RAgh#hDMf~6LkP8q&n9X%3; zya}e-oBu0rwncl^DnyTEv-3R?>k)o1f3S?;&z3xuzXrW~SfDT&5d{nE#uQ*uup={! z68`uOWsEuY{EIcMpcUcHlP9WgowyVNoZxq|5*!QeNPe*xfJ82yPsqk*y(03ReDqU0 zr-bf%ay8FmuxX{C?PiebwRrpWnqEG)(YgQ~1q~+SHRIN4HW|&bOxBEX=1|t*x zruv726TMX1#cvr$P$J-q@*!D>EeR1g3w%~h{5#tDc01W++uXIqD{cjWNZkE%``dDj2e~J;D+lmn!dJ44^Zejcpt+Cq!pS0En2WuBYu>0H(R%)yPo z%DzZ%!cE1YebolL6-#tNH6Ijg(Z*g<8M{4U<{1nRhQnN zXr)xzPpqx!P2_x>PUqiG#=5Zp&l4W#Z3)G$jf=H zz`=<7c^;S_aH-M3qM=mN1GXUj*%ao-+zjD>yI6S-Ce)U63(HF()ac02T86r(;jM27}>K#s0DvzDkQg8 zO=0PPH0;Ce%$Qnw?Q_^H6Nr{GH#_h>G%B~1EQ!+?u{ZeY(969NH`P;B)L4FY6BnehGF-OB@4ci&pK zy&deDe1=H^X)*j^DhI!({K;_0)I-6zY)XnYslZI)aF!&fi=B9+4CQ^~Fv9tsn zuMde9@j4WeCJ_9C52oQq_en_Appn_o{Djvgg+E^D-Hp~dsAllaK*x{N5EVG|PzWGE zBnw|sY6TCjJzOYION1FbmauT)=$K|%Yi>cZKx=q1t zLMfngKV^1=wy&Vyf;Hp^4+MN8%7H5Y;|2(5Cu`Mc94x%2`6ZFj00W6!<&%Q8h>}22 z>vb>zj2@DxM|$UWhW|dtDdn;l-N|)9fj=Q3gb*|+ju#3G^rh<&=c ze}uXZQdl88|NouKf8C@1M_1pz@)-75y}(q@Nk#@w@Be7+%D_T>fq_K>3?Ca;&`<(Az@cqdT&vDM2 z`*}V0eZQ{jdR^DQMNG~^*QXfgJ#5J}`Sv80XG=5gZ8^v`uL7)?!8V9Yul$uil(c*3 z1slgwb@Wgks~-68D`SjLUJD$~!=w0^WQ4Pr4I*Pz#%D0cEoz4w#mkwIM}I&7w^M6v zi3AbE)RqGaycQH7tt(b)tENCKx2qp;wYgN+^MaB_0^T8ldv8<9Er2oz;*s0g-KCrW zc=I?I+i-`jXGRL#MYmtTq4wjs@w_XgAhfpi?>{?@X0~7-VABzcTy20=vP1ho@yX4omdV&-Y2w0r|`ND+e1ST zW+mlPvo#JKM#Cod2P`2B!QX-40N{+v#fZBZwIAUD94DVIB$1I9S4OuDULSH4VX`E@ zc1+GFtZ?iyI~P!=8E1wIJ`OB`_C*f90=G>z%37c85^wtN<~+%H6Vu) zA1%JpVq%H%*>6NdFD|zVc`=UG2LRnG@g&V7LV97Rx|-noB_HSFaPhz(TNAi$DVE3a zdU%2kNI~9kT&{lZCt@jJ0B4E!Aq}?x6NJvu5HB&A*?qA95?5K!VMLe#;RJnS+a-md zx}t*`!=l_b7fJ_*RC~t933S4y7nX?SR)8w#%r5a+jN5wm!zb6O#_@wt%{E~_SZ>v+ zkG{|4mrHr@!Hk%S``CBh2ZXUIzq*?4fWA^XS+<$Y3Zm7$pnnx5qcUH)Xf*oa0F=## zE=aEBzP6HGv!ud?ZD`bsYI1j#9*d{Iv8*caSH@XZF`dtE22HbUAnZqe;gN#;^pL*% zFjs9E;TfLb5WGAMd#Ikdr3I4c5|>e91j>CapV$!;U$f( zQf9|Z?e5IzGpw*BU&E1MM{B~~X_2?ufVvcce-*g~hOkD}sP>61oX57*SKWD8^fQ8w zthbk|j(y7}e5+<5o~Z7QU6TqC$!k6fq@$zloM=_%b=oXd*al@5#%XH*EqU)ls^G!+RQ8W zTjwx*%I#eM2znwTcdfY@q^H_NVb%4UK{$$xV?0C!xupoCZV$b~1y%irV>u#dn>fXw z{wrWZDgGt3%gn$bQz;2iuhLJu=9aPF6MX&YSlLR+zD2obLV)L-%DT4Px&brc)jjHZRJ%3~-Spf#HQT z3|%@DO?z6Ei_0$^pXNuHb?i)W5J)=F=lEP*0fu7t;jAb>AXHW%0tYJG1n*Fz!tV?< zWd^kDF?Ti0f>QRJK$`BhwmZ|1nCYdRcYB*1`l`o;OEqBoDGhiddhX;jg(aZt<)-Lw zYx&Q>or!%PI|>Fa_ESyd=+}iA97@_gCzLHjPazMwqR)lK%hAfBa+IAeiVhrWaOKB4P0?G^ zk%IEc<$l2r6!Eo?fB+Pf(Q=}4v-9}|DV2Bk2nd6nG@t+S^SVW)iE(+EYp-uaD1d`{ z57&ackgmJ`aV`v)d80o(s%W_m9LnpuQWP5Lv9G;M;H1&g9Q6C?s~(~w3fWhor>8lp z<7s-}>qi+EUwPa}Kh=h|@CG{UTcbCvZBQbwtWx3N z9nV%H#H?tHCTN)WN=z#=>W3HM!;?SI@;@>>pET%@F7GF4go zM8&3l{^zWjKSfsetsh}PJ;A&uyDY%J5yffhHd>;?dsm~LU-?Nf9a~)w)nQYs^SU-I z_|k*2CcEoxV)<3NeNQzH2Ok25^j~>bZW#>#Bm0uxQ2i8eyn1wD0at3Ba!T?ux}M_e z6V$@zoTWf6n8onBArGmCR?ySgVZ!{^1L0;fI_^}&k6p=c(KZe+=RSM$5ny;u46mTw zC}rjiyA?KR4kp^gn*|=Iy4E$AeA0#hA#pHBB<>R(tAL1&Q`&M0Itp)V^4_I8`Du-J zMKytfrs1a2Q_nLaAMPk9tm|%o`ON2HFxI{Lw6nA^ucB$&CA|z0a_9L)`_r!~6FkA7k#@ASaba<4zbGxrRN++8rmP&Y7CVGI z`K)+bL)6j1*x+r_TmSP>v^O7uIr@9k>1U_MIU3Jcqc#C(tKKG+VOo1IIy@8Cl}XF! z)f1+DiN8bBppCd;6YWQ8lQ?!HMChV4&#+jXWevhA)oCYY{<|#sFO_;LekO-LoL9o~ zIO401k7&-*0jb&2ai-L?@vXC$)?DIcqtK5)%EW8N^^x2!F`vcH%j#3zGg@FYOG5G` zUk`a+q`lQuo&=|&i~l1j%4UP-P?orp5=PSqZG<7WexO;cfX3e!n0CE$Q{@Ou6Mb+! zk|y7_X|5U#t_&$OAv42C(kV_2(elW*1tW7>Ch;FPM*_H@_N7x zCloVKIM8l*=iGW|odXVKJ0A?VyPJ z$hAlH;`aXeGoS1t1Ur8ZnbvSdtxx5~b>spm$JCd-{tSWduMC1Hx;+{<*ET-%8f{1z2#Jl=pv+@3 zVXI7?OG&it2pAfCL(&CtczKbA<%hr^d~92yf3MaCqx)jofp7(eRK4+93iO6xCw`dL z5Z3W0*2^wg-L9LW0hB=fQ zc`g#C2t3s^Ucub2XUaX&?+pC4GPX*sF3S~6TZesZ**74Z8r68@*cf)_dn#vJ$%aIs zcg@p`nd(1^tK(}|A(hZn`EE!34PHdJ{X;6VLaT}`i{GTFHXm-k$M6>B5+D~I+M2Tg zMRwA&@1!RA)BivB=Kv}EujN1a^Ai0ZFz_F+aPtK3J$aa1`m@suOr~{cgL7K!ALwus zO}`v1EmaAI6PG_>w<mHU?y=m&Jv1`V4l zupiA0ZHZ-7At9SUdK=Eot@;n|`|mL$m)rond2PnYatNpPOX38@_}3DHf8RONmuF~x zLcSW;1!Z^C%1RmI7Qp%Z=;EyQ>%2#S{{U*82k?PBL;URQrgx%5Pp7{H`R|wU0#kk79_vu*^dN4+o@i1VXlMuJ|C9IdGsiyP6<4eI zR!qik&}L74e>~z$>d-?HjGa&5yTPaZ1 z_r5m7383QQGOuO`DnEIrXO?!&r;4;+1X?k7^53OF4Cwp^c36`O(C^!`4YEIN6~dbx zpin8J0@7&NN)pQ%@&wK@ay*Ky4A`pp=BU*=_j9=8<0-)i8Nz+KaTb`rDjRV;-I(JZ z$~T@g87g=nfd~Amg1n8#l~6TAtA*c89P%**Mi8bvNMYad-Q`y+9NA;`X*KD5F%S#z zegVy>tkye`+V|5s0K&blBQ;t~{AykoR1Ak}o*EulBA|YN3&E&%4GSBu;^Wezs^vZqKkJ2ugTG|1!QCl)IG zdZag0FF)!Xj-}6tnK@Jc+=gUY0j1`8tgOs9zBx3R!u9;N+iUC+AK=~@0CR^u8(ea8ljMmm!6 z0o=4s0OWU9E+R?6k~zC+VRNd1?K|0YwFW3RMkv4#=Yv6CHs7gXPu&^>9=CN(Q!0M( z!pNH$9B8L!#rfu3NAK)J$eM{4(pd4v&yV>%ckTa#YE4l--JMb9OF= zB9E2y&_9mo)CcilHt)WZ4_KbXzVO`1LvC9QZigjBi$Gn5aEUvQaf|&Db;CWGH^bX~ zVg3z!8*8W}0$ZcMuzjS>#!R7Mem+~FQtU=wsdImKHx@fKbj7)^TDMi}9(&Zp;BG!fpX1<3DAiud3{aXS80dS~SqIlQWGt|UJl`gI~=i2>1!M4GLUQe2^F~ciyss)&6l_hPU~{;`rg_y@Pfh0NUReYag~F) z7pSyF$V{W9i*rC!T^Mls>KigyX*y>r`CSiNk?>c)?HbO!UlG9Uny+K`Yih_48#a|+fx9toMA6KT{=b)l|JLZ`n^aPX-_Zrd(0r)z+%*P_h5 zrqc#0TD=_-EdMpIVolO#zOM=FCB0NacHzE4joNR`H8T1m8F?;8Ux2P^3BOro>6H*2 zS=TKJ&t{PWjybajFrLkQd)<*tv&Z{&XKuQ05V(`<-?}_iJU$gOATMTdQ7m zeZA~D*thIWsBSrr_nq&XU}ZZ@PNshiz@?GHGr@Dz8hY#uD2`6vhTOFlMurTa85=tk zmH}73Bf82OXNGj%u(O#jUd8f@)9od^MtS8a0JQ3DA7|L*@?>ERO-H=~{>zV2CJ=Ig z235Y6NCCj~>aB6D29^ul6!RB&72O04`E{-kjCe|abPJ2TDmx=$PGIVZe#tx|g*6tN zi@KpoHK`%=^9`Yf%wTO^?3k#xg}!%;8ZGz21|(ihj?I!pK@vETIwZNk3_3b(P**AF zdWS$zb?h^JAEos&FP(n?)pnqjb~eJV!J9K!QFnGQLv6EfThNwzW#$h+s2)%|2XjmOg(GCj@EkCO5J*Tjqe;w7=*oBtLK>V+Sp9J>zJz- QP!>|$xpfzgyJ-{hKWNA24=9tXqzwtdV5 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 diff --git a/apps/android/app/src/test/snapshots/images/com.codedeck.plus.ui_DesignSnapshotTest_web_sign_in_sending.png b/apps/android/app/src/test/snapshots/images/com.codedeck.plus.ui_DesignSnapshotTest_web_sign_in_sending.png index aafae5e346d79920a6c30bdac60c3144098021c8..a44778be1e6b0c6b633dc42a979328e89902fb02 100644 GIT binary patch literal 59314 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

ivLO3xy^ zTZQt87roZqoVbSjGUL#4dT>W;nQ5Q@{(Zby|0OdWFPd5QLcdZvUO@fN8%|d%WkJ`5 z87Cp+`3pV5Bdb5b_StPap}E#wRGG~<98(0{aP^9Q_s8k%0F4#;xY_hsYKAz_x!Cc8KIxh za@R0^^J1&K@aScv?2pb#>Cu5sz;=@UW4@U+>eEyXp(5nysf!1Z$hnZy{6V6~+;g0wG+f zg@r?=c)DV8CPCBfTK{?TZ0lLT#V*z^hme-Zi!aZz`TV^5J-aIq_!S#j&s#Dxkvf!z%P|adEj7*(F808gd zVKuE{Ix1+dLnMzGxNnkoi(AOET1AFN48z54pMD9Kxg33Eck*d_e^#49(=>_yX4ZK{ z6<3yAxr6nhHU^T71sI(cq9gvok+0S=I~z07R6XES=}h{S6FVJyTXgfqrY8@1s%4Sq zXK8;R_(idP54`H&M9nDb6lAqwD2)E@I%zGc&3QYf&( zCLjF(?fS<8S3Rh0<}+Vi-jXP_p|f_yvw)-WzUMcJ?R#Yq=yX_Y=w{NNG0OgIV8sM7 zsI@2PTybL;ay*W`wdJkmCYk6P)U0=P$Rsx!#-Blc4ehZFn#< zzemg6yNSC3#LQ&#h+OhH8ppK8@pPW>s zCy5~rc^sM_xho5>%?XvCF|17g{jm;c^xi*Np!?aHPB8t+-bG7SqWBh*vI9JjgGQ^f zZ&a-$FlRh=?nswjJpA%^c7lMgJmUxUUHg^QFf~kB3A6QTJ7*B*twV?i|G-dq{v8xz z#`HfU$G_#H|1&5Y)k8sl60Q`9ffI6&!_NhtG=W3is49xbxCWUb<5!lZ4I%aA;R2;6 zcR7)x>X_a5T8gw!-Tyd#xRdnv_zPiK{X*0Ce~&{QmJs6BeobVM*H_>ftP}`!U&N^E zaaO7J2>;pv2sngCLg%3^NOgEI9t0ZL?}MTU|HB5c3h9_pX|SCc^?s zC`h0UjazCgJK_>LUdb!2K|FtJ#}u44!3o(x=O_oABk`t4f>yS!w--Jr+!uoHp2yI6 z6Lrn@{o-t)n#Gq_%zvEu%=lVjObhP0*}Ow$#=cr^cTE#>iA;k|EVhZzH3iovbl(u6 z&4LVSc@7ngP*(rE_~cggo~663Uttc(d1#seSS?wx zu0yBrYtVF3SXwXMBX%Y5bT*zSRKR2A(lSC@8 z4iT8Qs579nwJiuO<`=2&ceAUZo+CfX_uz$KQLBj-kSd@faeP7^b6#~!jO7P^7HRwl zo?QC=*NS>7?JUe8q?wsgq>x!6Jn)a6tNL&vwAGfsca)W9dA}xJP{CskX@7VTYY&$M ztMbusw#Jx31los;Oh4ac?uW-Y1Vx{;uC8bqe1|Kpk0Kcxx&A8YUJi2g6$(W=uR=jV zVIX2ZR+eTMj6x zU|v$Hly{gxv1Nk6rw5gELRJb(RTOO#^>#xHjsVnLU=JwWfC$iPc$77gT zG%OFW+sYh#?9Up5!|&f&x-9EI**jKbF+{*vo|)MyVhmM$m(b9vfY3iTb08*xdnnb+ zxb{(&-9%Mhu5Lk{HxntzVy}_gP=4(+*u7Hkra^2_4Vz^(4)M0o=-~Qq|Zp?zmi&|J2;eAQ;1HE^q)Cbc|P3(p)W?Ue9 zn)G)H+!4R`>A{-g#G}vj(vR5l1H1a1mdc!_Rt5{EF0l!MJa-vtjXz(AI3VIV8diOq z!yFvJded=j^hUmQpA7TwsvD^u6`E;P%Cwsx+pY#rz_8K&PGWkAPKWV|iM27$?+zoy zV^EWpYEAA-t8VW#sP{LvG|<#^d@y!V)Nat1kh?p*_RHG1H`Bw@X2*dK#QFETL|j@F z%kba8$@C>{HW~sI71ma)&NjYTn|2mu5qmj7JWg9$Yg8RQ*a~QGWtoHIy=d5d!YA^L za3_ur)fJlZ(69t`ko_jL*z!wHz?Q$z&^k}GsKW!n+F=M zQ2ai-;d!umrK<>NO)B3{!3@)7sG$A<&e`l|I>)wXKgY9Ei?X%f?oFI0S-nphrfaaV zm9$%5I=s^|dD!+W!wpo+co8v1dwh#hKxtGVqEz-K07;!aLo&DSda}z@>B?itfYT~T zSJv@feDb$%E(Zq%DXefT{(5FmV0`jX8sbk9`ki}AQ{*C4mowHvp3QpSh9?m-Lp6we zTwKVLQpcEB7Fo*AW%=zc?>IIFWhZ`8NoGlTh2}tR3K~}L)zEI-%^OuN^IZBe5}gK0 zmY04<(WtuMBStOUBcQ8`f1rmpFSGY2Yd*)i!& zXVBNawWaq`!o5FQhYC5nyp6>)qd>NtMwdl>gR*e>MD2M2wEG>5)%=OUd5mok4$+he`u@k)d4Q;Sv& z9w9{0gZ@Y{ZnMD=>+kblPOgT;pkvUSxAg?QXPStGt{od_DEf*lzgpV<1=b4jPRYmPbQZPuUp81YlPUEj~C7(AETUNVmu zI{WgP<@OKM^n0c^@~&*T0^m@=AedOI&^BdxKC>8&N2UUBthGYWj>Q)M{A_a7RjhhI z0%x;&dUBn`0d@1s)k&?UTPFF4^vn4qp&x&JAy;_5Fi&~(gg(C*ISa{1x#siol{&%T z*Lu|+>Mexw@|hY>aZ6mduB1!2cMwS<|7q^6XH}2BBrIcv10QP`ZZOrJLXGJ{oKT+fmal2|^{1DtmEzhR z8uZ$BNQG^`U$dMZZ8Hk$)X3OC%H#y8&TvVQ;}M+hWsn!i#a=P~O-Z4{>MLS5D5$0( z>@fPZcZFKmw^zhg9ScGr8=0L&H!o*RR392)VU!_r;=ov-iFKkSZ1pLy47ab#KwI2e zN{cKVTV^L*dsAw+kUGrAxreiHjTgSaW{< zdqEks>z7wEi9V0dHM<+>)C$tnt*(wId&!o#qi#uA7;C>~sSj@^zgokARYdM|_zofv zCsR*Cg2*ldx##t0)4f)rvMOU0B3_2aKff(n9q*3b$7Vi%*JZQ#sw?xR;B@RXo8AmT zv>mr9nRZdF)`dp7>|XX8FH*0YHwN9O5@hOrO{VOJ zzLi&;lzhLMR^*C!HqvNoE;OJ0=!txK&Ptz69ZTy#cuDl52<{qdiU2u&o&ugWZNs{G zKyD2hS|M_*v+FLeh3QCtORA7nezg2OrA#B?IJ#4$gv6Sax;pSe_&o-ACgOP*S(8&C zY*PF1@jP<25tk8s2HC5w=0oVDeR@cWaUoBjMl`JQ^A+5r)`hr=(;B?VCp3olq2P8& zn4!A*`|X57SlH3q-Db^`gE?DECoD+k_w)1DoQW@8`>sREn={%f_w{bN=mwJbjTip*M?1OfLP=hr17$A~m!J^3$^EFtMo$CsQ#`NZ`ar{gS&%5H&L(wyc;x zyrBAajxvi3PBB~1v}w=gQ6f0Jfy<@JGM@EJ=7+1>j)u{~{5)3;<_gA%O}yNh3gd^n zI?byYb5O)CfC=37A(2ox@A=eL6}}^9eKOqnAai(?#iLkoWDS=~--4%Z=U`52a#xMQ zAU{OmGJMg8B(HXXqeX8<=pNS58FO~?P${I%U~;=KS7+sCJ5y#$afzFvnnp(wymws| z)8wFU=kW==NLvz~FmPA)W&|A-g52^|*qpqQC$^GeZtrKGZ!Q}#c^@tlz-8*NwVkUD zg^bp$uMj+#mSs#g^r{Xwn-lIy-62NIkhs;XIXp||QhdL#ApA);{ZX(cwg#V_4(94V zV$w=X1BdfS$?EhG@NZ%xHn`(}Ku}PyCf)oIFQ%P$uTS|qy(%ZCBz#k*V4&Z2&5!?K z-}E^|ae(Si^dE!9jLCnd0RPSe;70yCX@ECjf|CF8$KUkff9(Vh{=uB{Z;J81`PBcf zukC+2L4-Hvp@6Nd5;%{AYNeIxN$dHLV&vb=y9ZtJRt%<=F|ⅇ5ytHG6d}+uaox^ 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

Sign in with your phone

  1. Open CodeDeck+ on a phone paired with this bridge.
  2. -
  3. On the machine's page, under Web page, choose Sign in a browser.
  4. +
  5. On the machine's page, under Web page, choose Browsers.
  6. Scan this code, or type it.

diff --git a/docs/BRIDGE.md b/docs/BRIDGE.md index ad1df405..b3e80a7c 100644 --- a/docs/BRIDGE.md +++ b/docs/BRIDGE.md @@ -232,7 +232,8 @@ accepting it. Plain `http://` on the port redirects to `https://`; the onion listener serves no page. A browser signs in with a paired phone: the page shows a code and a QR, and -on the phone the machine's page, "Sign in a browser", scans or types it. The +on the phone the machine's page, "Browsers", scans or types it (the same +page lists the signed-in browsers and signs one out). The browser then stays signed in for 30 days (a cookie only the bridge can read, sent only over HTTPS), and it survives a restart: signed-in browsers are kept in `/web-sessions.json`, keyed by the cookie's SHA-256 so the file diff --git a/docs/CLIENT.md b/docs/CLIENT.md index 0bbe1be1..fe79908e 100644 --- a/docs/CLIENT.md +++ b/docs/CLIENT.md @@ -412,7 +412,7 @@ link is an extra path beside the relays, never a replacement. A machine's page has a "Web page" group: the `https://` address of the bridge's web page on each of its `wss://` direct endpoints (onion and -plain `ws://` ones serve no page), and "Sign in a browser" +plain `ws://` ones serve no page), and "Browsers" (`screens/MachineWebPage.kt`, the wire in [`PROTOCOL.md`](PROTOCOL.md#web-page-sign-in)). That page scans the browser's QR in the app's own scanner, or takes the typed code, and @@ -421,7 +421,11 @@ the code is on its way, signed in, or did not match, and the page says so when no answer came in 15 s. A QR naming another machine is refused before anything is sent. The QR has no deep link on purpose: a link opened elsewhere must not sign a browser in without the user on this page. Closing -the page dispatches `ClearWebSignIn`, so a late answer is dropped. +the page dispatches `ClearWebSignIn`, so a late answer is dropped. Under +the sign-in it lists the browsers signed in now (`RequestWebBrowsers` when +the page opens and again after a sign-in from it, never polled; the view's +`webBrowsers`), each signed out with `SignOutWebBrowser` after a +confirmation. The same group lists the browsers already signed in to the page: opening it dispatches `RequestWebBrowsers`, and the bridge's `web-browsers` answer fills From 82354939881d4338523a25575e005d98432b2dfb Mon Sep 17 00:00:00 2001 From: deymosh <232244450+deymosh@users.noreply.github.com> Date: Sat, 17 Oct 2026 18:41:42 +0200 Subject: [PATCH 30/30] fix(bridge): a browser whose sign-in lapsed is not listed as signed in A lapsed browser is only reaped when it next asks for something, so until then the page's list, and now the phone's, showed it signed in. The list leaves it out. Co-Authored-By: Claude Code --- crates/bridge-runtime/src/web.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/crates/bridge-runtime/src/web.rs b/crates/bridge-runtime/src/web.rs index 3df5fa29..dc8774e9 100644 --- a/crates/bridge-runtime/src/web.rs +++ b/crates/bridge-runtime/src/web.rs @@ -447,13 +447,16 @@ impl Web { /// page's own list: both `browsers_json` and `browsers` read it, so what /// `GET /api/browsers` serves and what a phone's `web-browsers-request` /// is answered with can never disagree. + /// A browser whose sign-in has lapsed is left out: it is only reaped when + /// it next asks for something, and until then it is not signed in. fn browser_rows(&self) -> Vec<(String, WebBrowserInfo)> { + let now = now_ms(); let mut rows: Vec<(u64, String, WebBrowserInfo)> = self .browsers .borrow() .iter() .filter_map(|(key, browser)| match &browser.access { - Access::SignedIn { by, since_ms, expires_ms } => Some(( + Access::SignedIn { by, since_ms, expires_ms } if *expires_ms > now => Some(( browser.order, key.clone(), WebBrowserInfo { @@ -466,7 +469,7 @@ impl Web { agent: browser.agent.clone(), }, )), - Access::Pending { .. } => None, + _ => None, }) .collect(); rows.sort_by_key(|(order, _, _)| *order);

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 literal 33669 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 F{}=X+((tSSsB=?Tet2& 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 literal 33981 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 R?W-neSxF^miTIm<{{^A`3U2@a From b74911af76ef3a2ddd399783330e57374e1c11f0 Mon Sep 17 00:00:00 2001 From: deymosh <232244450+deymosh@users.noreply.github.com> Date: Sat, 17 Oct 2026 18:23:23 +0200 Subject: [PATCH 29/30] docs: the phone's Browsers page, where browsers are signed in and out The web page's own instructions, BRIDGE.md and CLIENT.md name the page as the phone now calls it, and CLIENT.md says when the list is asked for. Co-Authored-By: Claude Code --- crates/bridge-runtime/web/index.html | 2 +- docs/BRIDGE.md | 3 ++- docs/CLIENT.md | 8 ++++++-- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/crates/bridge-runtime/web/index.html b/crates/bridge-runtime/web/index.html index 41e835e4..bd7d1341 100644 --- a/crates/bridge-runtime/web/index.html +++ b/crates/bridge-runtime/web/index.html @@ -33,7 +33,7 @@

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 diff --git a/apps/android/app/src/test/snapshots/images/com.codedeck.plus.ui_DesignFullPageSnapshotTest_web_sign_in.png b/apps/android/app/src/test/snapshots/images/com.codedeck.plus.ui_DesignFullPageSnapshotTest_web_sign_in.png new file mode 100644 index 0000000000000000000000000000000000000000..689786643bce4bb6ffdc7843e803d1f41dd13c71 GIT binary patch literal 17773 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 literal 0 HcmV?d00001 diff --git a/apps/android/app/src/test/snapshots/images/com.codedeck.plus.ui_DesignSnapshotTest_web_sign_in.png b/apps/android/app/src/test/snapshots/images/com.codedeck.plus.ui_DesignSnapshotTest_web_sign_in.png index 1a9ff466f71c89371e658b06aee00becbba3f3e7..30b4fc82d4cd021d90812168822e892b781bb0c2 100644 GIT binary patch literal 60809 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