forked from thijooree/android
new feature: long press OTP card in OTP codes page to export or update seed
This commit is contained in:
@@ -21,6 +21,29 @@ Each card shows:
|
||||
|
||||
Tapping anywhere on the card also copies the current code. If no logins have a seed, an empty-state message is shown instead.
|
||||
|
||||
---
|
||||
|
||||
## Seed Actions
|
||||
|
||||
Long-pressing a card opens a menu with:
|
||||
|
||||
### Export seed
|
||||
|
||||
A dialog titled `{bank} · {name}` showing:
|
||||
- A QR code of a minimal `otpauth://totp/{BANK}?secret=…` link (e.g. `otpauth://totp/BML?secret=…`), always drawn black-on-white so it scans in dark mode. No username or issuer is included, and algorithm, digits and period are left out because SHA1, 6 and 30s are the spec defaults. Export is single-account only; `otpauth-migration://` is supported for import but never produced.
|
||||
- The Base32 seed in groups of 4 (selectable text)
|
||||
- A **Copy seed** button. The copy is flagged `EXTRA_IS_SENSITIVE`, so Android 13+ hides the value in the clipboard preview.
|
||||
|
||||
### Update seed
|
||||
|
||||
Replaces the stored seed for that login, e.g. after re-enrolling the authenticator with the bank.
|
||||
- A red warning banner explains that the old seed is deleted permanently.
|
||||
- The new seed can be typed or pasted (raw Base32 or an `otpauth://` link) or scanned with the QR button. Scans that contain several accounts (`otpauth-migration://`) ask which one to use.
|
||||
- Once the input is a valid seed, a live preview shows its current and next code with a countdown so the user can check it against the bank before saving. The preview is the same card as the sign-in screen (`view_otp_preview.xml`, shared by both), and tapping it copies the code. Input that isn't valid Base32, is shorter than 8 characters (such as a pasted 6-digit code), or matches the current seed disables **Replace**.
|
||||
- **Replace** asks for confirmation ("Delete old seed?"). Confirming calls `CredentialStore.updateMibOtpSeed()` / `updateBmlOtpSeed()`, which overwrite only the encrypted seed. For MIB it also calls `MibLoginFlow.updateOtpSeed()` so silent re-login uses the new seed.
|
||||
|
||||
The username, password and sessions are not touched. Other places that need an OTP (transfers, QR pay, pay with card) read the seed from `CredentialStore` each time, so they pick up the new seed immediately.
|
||||
|
||||
### Algorithm
|
||||
|
||||
Standard RFC 6238 TOTP:
|
||||
@@ -58,7 +81,7 @@ The OTP screen is informational — the user copies the displayed code manually
|
||||
|
||||
## Security
|
||||
|
||||
The TOTP seeds are stored encrypted in `CredentialStore`. They are never logged or included in error reports.
|
||||
The TOTP seeds are stored encrypted in `CredentialStore`. They are never logged or included in error reports. They leave the app only when the user chooses **Export seed**.
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user