mirror of
https://github.com/narrrl/proton-stream.git
synced 2026-11-04 00:47:00 +01:00
fix(core,app,android,cli,packaging): harden account sign-in and watch-history sync
- Desktop shows Proton's CAPTCHA instead of failing the sign-in: a wry webview in a child process of the app (`pstr-app::verify`), confined to https://*.proton.me, hands the token back and the sign-in is retried. Linux packages and CI gain WebKitGTK 4.1; the Windows zip and MSI ship WebView2Loader.dll, without which a -gnu build does not start. - The desktop keyring splits a secret too long for one entry across several, so a Proton session with many key salts survives Windows' 1280-unit cap. Short secrets stay one entry, so every existing secret still reads. - `WatchSync` runs against a small `HistoryDrive` trait and is tested end to end against an in-memory Drive: two devices, newer wins, no re-upload of an unchanged history, a missing file written again, an unreadable own file never overwritten, a newer-format file left alone. - An installation's file unwritten for 90 days is retired by the next device to sync, after its entries are merged and carried in that device's file. - Removing a share keeps its watch state: sync would bring it back from the other devices anyway, and re-adding the share picks up where it left off. - Watch history syncs once more on desktop exit (bounded to 3 s) and, on Android, through a WorkManager job enqueued when the app leaves the screen. - The second-factor prompts say security keys are not supported.
This commit is contained in:
1 parent
26cccd5c63
commit
d9ca8f8d60
28 files changed
+2475
-186
No files matched your search
@@ -1084,7 +1084,6 @@ async fn play(
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Unix seconds, for the "when was this asked" columns.
|
||||
/// Walk an interactive sign-in through whatever the account asks for.
|
||||
async fn login(accounts: &AccountStore, username: &str) -> Result<()> {
|
||||
let password = read_password("Password: ")?;
|
||||
@@ -1092,10 +1091,12 @@ async fn login(accounts: &AccountStore, username: &str) -> Result<()> {
|
||||
Ok(step) => step,
|
||||
Err(pstr_core::Error::HumanVerification(challenge)) => {
|
||||
// Solving a CAPTCHA needs a browser engine that can hand the
|
||||
// token back, which a terminal does not have.
|
||||
// token back, which a terminal does not have. The desktop app has
|
||||
// one, and keeps its session in the same keyring entry.
|
||||
anyhow::bail!(
|
||||
"Proton wants a CAPTCHA before it accepts this sign-in. Sign in once in the \
|
||||
desktop or Android app, or try again later. ({})",
|
||||
desktop app on this computer, which shows it and shares its session with \
|
||||
pstr, or try again later. ({})",
|
||||
challenge.verification_url()
|
||||
);
|
||||
}
|
||||
@@ -1108,7 +1109,8 @@ async fn login(accounts: &AccountStore, username: &str) -> Result<()> {
|
||||
return Ok(());
|
||||
}
|
||||
SignIn::SecondFactor(pending) => {
|
||||
let code = read_password("Two-factor code: ")?;
|
||||
// Security keys need WebAuthn, which this sign-in does not speak.
|
||||
let code = read_password("Code from your authenticator app: ")?;
|
||||
pending
|
||||
.second_factor(&code)
|
||||
.await
|
||||
|
||||
Reference in new issue
Block a user