Sync with the server and scan-to-join onboarding
ci / build (ubuntu-22.04) (push) Canceled after 0s
ci / build (windows-2025) (push) Canceled after 0s
ci / deny (push) Canceled after 0s

- Device key (DeviceSigner): Windows TPM via CNG with a DPAPI-sealed software
  fallback, Linux Secret Service with a 0600 file fallback (warned in Settings),
  macOS keychain for dev runs. The store used is recorded; no silent switching.
- SyncService (Tauri-free): server URL and pins, create account with the
  server's setup code, sync after unlock/save/browser save, every 15 min while
  unlocked and on demand, status events, integrity alarm, device list with
  fingerprint approval and revoke.
- Onboarding: "Use my phone" (join_start/poll, QR rendered locally, 6-digit
  code), Emergency Kit from PDF/PNG/JPEG (hayro + rqrr), paste setup code, new
  account. Then only the master password.
- From a signed-in desktop: "Add a phone or tablet" QR with countdown (cancel,
  lock and quit revoke the ticket) and "Approve a computer" via pasted join code.
- KESTROVE_DATA_DIR / KESTROVE_DEVICE_NAME for a second instance; ignored
  live test drives three instances against a real server.
- deny: ignore three unmaintained notices for zbus 5 sub-crates (Linux keyring).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
2026-10-18 07:51:06 +09:00
co-authored by Claude Opus 5.5
parent 7701b65087
commit e19370f261
13 changed files with 3532 additions and 116 deletions
+21 -1
View File
@@ -50,9 +50,29 @@ system's on Windows (`GetLastInputInfo`) and macOS; on Linux it is activity insi
and fills). Screen lock: Windows input-desktop check, Linux logind `LockedHint`, macOS session dictionary.
Sleep: a jump in the wall clock between polls.
## Sync and onboarding (docs/03, docs/10)
* **First start** offers four ways in: **Use my phone** (default: type the server URL, scan the QR on screen
with a signed-in phone, compare the 6-digit code, then type only the master password), **Emergency Kit**
(PDF, or a PNG/JPEG photo of its QR), **Paste setup code**, and **New account** (server URL + the server's
`KV_SETUP_CODE`).
* **Device key** (`device_key.rs`): Windows TPM via CNG, else a DPAPI-sealed software key; Linux Secret Service,
else a 0600 file (with a warning in Settings); macOS dev runs use the keychain. `KESTROVE_DEVICE_KEY=file`
forces the file store.
* **Sync** (`sync.rs`) runs after unlock, after a save, every 15 minutes while unlocked, and on "Sync now".
Lock drops all keys (core), cancels a scan-to-join and revokes an "Add a device" ticket still on screen.
An integrity alarm shows a hard alert and a banner; syncing that vault stops.
* **Settings → Devices**: approve pending devices (compare fingerprints), remove devices, **Add a phone or
tablet** (10-minute single-use QR; Done/Cancel revokes it) and **Approve a computer** (paste the join code a
new computer shows under "No phone?").
* **Two instances on one machine**: `KESTROVE_DATA_DIR=/tmp/kv-b Kestrove.app/Contents/MacOS/kestrove-desktop`
(the second one has no browser integration). `KESTROVE_DEVICE_NAME` overrides the device name.
* **Live test**: `tests/live_sync.rs` (ignored) drives three instances against a running server; see its header.
## Roadmap (M3, kestrove-spec/docs/07)
- [ ] Unlock with Windows Hello (KeyCredentialManager, TPM) and libsecret on Linux
- [x] Persistent vault (`VaultCore::open` in app data); sync UI still to do
- [x] Persistent vault (`VaultCore::open` in app data)
- [x] Sync, device approval and scan-to-join onboarding
- [x] Auto-lock on idle, screen lock and suspend
- [x] Local IPC between `kestrove-nmh` and the app, plus the pairing AEAD channel
- [x] Native-messaging manifest installers (`native-messaging/install.sh`, `install.ps1`)