Skip to content

Restore login-name proof and keep the email timer fail-closed - #110

Merged
GoDeskio merged 11 commits into
mainfrom
cursor/dashboard-unlock-7d2a
Nov 8, 2026
Merged

GoDeskio merged 11 commits into
mainfrom
cursor/dashboard-unlock-7d2a

Conversation

@GoDeskio

@GoDeskio GoDeskio commented Nov 8, 2026 •

Copy link
Copy Markdown
Owner

Head

d04ec4e4f6ab77658ba608fbccc83f16deee8dfc on cursor/dashboard-unlock-7d2a. Do not merge or deploy. No new secrets, signing identities, store submission, DNS change, or release publish. The committed download manifest is not a public download.

Corrections on this commit

The device page checks the same rule as the server before it shows a login-name form. Argon2, and PBKDF2 above 600000 iterations, see that a login name is not available and that email sign-in still uses the account's own key derivation. The form is not shown, so nothing is submitted. The eligible copy says the envelope is sealed with PBKDF2-SHA256 at 600000 iterations. It does not say the account KDF seals the envelope.

The web vault keeps the case of the typed email. It does not lowercase that string before deriving the vault key. Marketing tries the typed case first. If that sign-in is rejected and the lowercased string is different, it tries the lowercased salt. A mixed-case vault opens from the exact string. An account registered with a lowercased salt still opens when the person types different case.

Migration 20261108050000 is tested by seeding verifier_hash = cheap-verifier, removing that migration's record, booting again, and checking the value is null.

Login names for Argon2 and for PBKDF2 above 600000 are not implemented. A uniform open response cannot reveal those parameters without telling an anonymous caller the name exists, and the 600000 wrap would be a cheaper password check. Email sign-in is the path for those accounts.

Email prelogin still returns the real KDF for an address that exists and a decoy otherwise. That difference is unchanged from main.

Local evidence

  • Login-name eligibility matches the server bounds, including rejection of Argon2 and PBKDF2-750000.
  • Migration boot seeds an old verifier and finds it null after 20261108050000 runs again.
  • Marketing sign-in against a local server: a mixed-case salt unlocks on the first attempt, and a lowercased account unlocks on the second attempt when the typed case was rejected. MARKETING EMAIL CASE PASS.
  • Angular vault UI: signup, known cipher, PIN and pattern unlock, login-name enrollment with the public-wrap copy, logout, username login, and the cipher password visible again. ANGULAR VAULT UNLOCK PASS.

CI for d04ec4e4 is the check that still has to finish. Earlier checksums are not evidence for this head.

Open in Web Open in Cursor 

cursoragent and others added 6 commits November 8, 2026 03:39
… merged marketing site.

Email sign-in still derives the vault key from the email. A login name works only when prelogin returns that email. PIN and pattern wrap the user key on the device after a master-password unlock, and the public downloads page reads the release manifest without replacing the home-page sign-in.

Co-authored-by: Admin <GoDeskio@users.noreply.github.com>
…vice.

Never leaves the timer off. A successful code starts a fixed window; failed sign-ins and ordinary requests do not move it. Standing second factors stay required, and a code that cannot be mailed does not complete sign-in.

Co-authored-by: Admin <GoDeskio@users.noreply.github.com>
…imer against a real server.

The signed-in onboarding rail stays off, Downloads stays in the vault navigation, and the timed email code is checked with a loopback mail sink: a verified account, a challenge, a bad code, a replay after expiry, and a mailer failure.

Co-authored-by: Admin <GoDeskio@users.noreply.github.com>
…unlock in a browser.

The restore test no longer trips the underscore-drop deny. A throwaway server applies both new migrations on boot and keeps the row on a second boot. Chrome signs in, opens Downloads, and enrolls, unlocks, and rejects a PIN.

Co-authored-by: Admin <GoDeskio@users.noreply.github.com>
…roid build jobs.

PIN enrollment now checks the 32 or 64 byte user key before the Angular unlock service accepts it. Linux and Windows CI jobs build unsigned packages. Android release runs only when a keystore secret already exists.

Co-authored-by: Admin <GoDeskio@users.noreply.github.com>
Sign-in now requires the vault email as the KDF salt. Timed email codes use a server-issued trust token and a login challenge, and the timer cannot be turned on unless a verified mailbox can actually receive mail. User-key wrapping accepts 64-byte and longer COSE keys and rejects a bare 32-byte key. Desktop CI uses Node 24 and npm 11, and a published release is what writes download URLs.

Co-authored-by: Admin <GoDeskio@users.noreply.github.com>
@cursor cursor Bot changed the title Add login-name sign-in and device unlock without replacing marketing auth Keep the vault email as the KDF salt and issue a server device-trust token Nov 8, 2026
…timer fail-closed.

A login name no longer resolves through prelogin. The client proves the password with a separate verifier, and only then receives the email and real KDF. An enabled email timer stays required when mail cannot send; Never is the signed-in way to turn it off. Trust revocation waits for the server, codes are claimed with one update, and the web vault lock clears the in-memory user key so PIN and pattern can decrypt the vault.

Co-authored-by: Admin <GoDeskio@users.noreply.github.com>
@cursor cursor Bot changed the title Keep the vault email as the KDF salt and issue a server device-trust token Restore login-name proof and keep the email timer fail-closed Nov 8, 2026
cursoragent and others added 4 commits November 8, 2026 05:50
…with its commit.

The clients image manifest publishes only the Chromium zip that image just built. A release manifest checks every published checksum against the bytes uploaded for that same commit.

Co-authored-by: Admin <GoDeskio@users.noreply.github.com>
The 100000 login-name verifier is gone. Enrollment in the signed-in vault
stores an AES-GCM envelope of the registration email, wrapped with the
account's own KDF. Logout revokes the email trust token from extension
session storage, and lock clears secret caches before it reloads.

Co-authored-by: Admin <GoDeskio@users.noreply.github.com>
Prelogin no longer returns a vault-key email for registered accounts.
Login-name open always reports the same PBKDF2-600000 wrap, and the
account KDF stays inside the envelope. Stronger account KDFs cannot
enroll a cheaper seal. The old verifier hashes are cleared.

Co-authored-by: Admin <GoDeskio@users.noreply.github.com>
The device page uses the same wrap rule as the server and does not offer
a form for Argon2 or PBKDF2 above 600000. The web vault keeps the typed
email case. Marketing tries that case first, then the lowercased salt.

Co-authored-by: Admin <GoDeskio@users.noreply.github.com>
@GoDeskio
GoDeskio merged commit ff613a9 into main Nov 8, 2026
11 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants