Add OTP QR import from TOTP and entry editors (#120)
Dependency security audit / rustsec (push) Successful in 20s
Dependency security audit / rustsec (push) Successful in 20s
This commit is contained in:
1 parent
93a08e9c65
commit
3c3574b449
12 files changed
+448
-23
No files matched your search
@@ -15,6 +15,7 @@ actually exercised.
|
||||
| TOTP tab and sharing | Rust discovers, caches, parses, selects, and generates OTP data | `mobile_totp`, `otp`, and `mobile_watch` integration tests | Discover entries, read a code, change Watch selection, and verify countdown |
|
||||
| Preferences and biometric unlock | Rust owns preference/authentication state; LocalAuthentication and Keychain remain isolated Apple adapters | `authentication_leases`, `secret_store`, and mobile authentication tests | Enroll once, then test match, cancel, rejection, and changed enrollment using the documented sequence below |
|
||||
| GPG key QR transfer | Rust frames, validates, reconstructs, authenticates, and atomically stores keys; UIKit only scans/displays frames | `mobile_key_transfer` unit tests and `crypto_compatibility` | Test public/private transfer, interruption, duplicates, and capture shielding |
|
||||
| OTP creation and QR import | TOTP Add and editor Add Field share the native camera/photo/URI input; Rust decodes QR, validates URI, and creates the OTP field | `mobile_otp_import_creates_or_appends_one_validated_field`, bounded QR image checks | In the existing simulator test store, create from TOTP, append from the editor, cancel, reject invalid/duplicate input, and save/reopen. Use synthetic QR images: the simulator has no camera. Validate physical camera capture later through the release process. |
|
||||
| Watch synchronization | Rust owns selected snapshots, pairing identity, revisions, replay rejection, receipts, and revocation | `replacement_snapshots_reject_replays_conflicts_and_pairing_changes` | On a paired device, verify background delivery, replacement, replay rejection, revoke, and pairing change |
|
||||
| Watch display | Rust owns OTP calculation, timing, and ready/empty/syncing/stale/locked/error presentation; SwiftUI renders it | `watch_runtime_generates_view_ready_totp_and_clears_secrets_when_locked` plus ARM64 Watch target build | Test offline and stale-snapshot behavior, wrist-down privacy, VoiceOver, Dynamic Type, and supported Watch sizes |
|
||||
| Lifecycle and disclosure controls | Rust drops protected state; UIKit/SwiftUI clear views, time-limit pasteboard values, and shield private QR/captured content | authentication, presentation, TOTP, and Watch lifecycle tests; source audit in `apple_mobile_audit` | Background/foreground, lock, screenshot/capture, pasteboard expiry, and protected-data loss |
|
||||
@@ -87,6 +88,18 @@ the tester is ready to enter the passphrase again.
|
||||
|
||||
## Manual evidence still required
|
||||
|
||||
Issue #120 was exercised on 2026-09-12 using the existing iPhone 17 Pro / iOS
|
||||
26.5 simulator (`FB5C6929-C10D-40C8-9A94-5CC592037FDB`) and its simulated store.
|
||||
TOTP Add imported a synthetic QR into `otp/Simulator Panel OTP`; the normal
|
||||
editor appended a different synthetic QR to `Example Portal`. Both saved,
|
||||
appeared in the TOTP list, and displayed the expected issuer/account and codes
|
||||
after reopening. The existing portal username and URL remained unchanged.
|
||||
Invalid non-OTP QR input was rejected, and Scan QR Code presented the expected
|
||||
camera-unavailable fallback. Physical camera capture remains for later release
|
||||
testing; no paired iPhone installation or real local store was used.
|
||||
The final in-place simulator update preserved saved entries and every untouched
|
||||
ciphertext file; interrupting an unsaved imported draft created no entry.
|
||||
|
||||
Record the device model/OS, build commit, and pass/fail result for each manual
|
||||
row above. Simulator validation is required during implementation. The final
|
||||
distribution issue remains open until the approved App Store build is installed
|
||||
|
||||
Reference in new issue
Block a user