-
Notifications
You must be signed in to change notification settings - Fork 1.5k
feat: Authentication bypass via biometric enrollment change #7351
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
OtavioStasiak
wants to merge
131
commits into
develop
Choose a base branch
from
feat.authentication-bypass-via-biometric-enrollment-change
base: develop
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from all commits
Commits
Show all changes
131 commits
Select commit
Hold shift + click to select a range
5a78af5
feat: install react-native-keychain
OtavioStasiak 8691f37
feat(biometric-trust): add enrollment-bound trust store and Option C …
OtavioStasiak 3a59438
feat(biometric-trust): invalidate biometric trust on enrollment change
OtavioStasiak d384c0c
feat(biometric-trust): show explanatory subtitle on enrollment-change…
OtavioStasiak c35c0c6
feat(biometric-trust): silent-bind migration for existing biometry us…
OtavioStasiak 7ec65a4
feat: i18n translation
OtavioStasiak f091568
podfile
OtavioStasiak 8b84535
Merge branch 'develop' into feat.authentication-bypass-via-biometric-…
OtavioStasiak 898b8aa
fix(biometric-trust): revert ScreenLockConfig toggle when enrol fails
OtavioStasiak 3dbb3e3
fix(screen-lock): defer modal resolve until close animation finishes
OtavioStasiak 1565c0d
feat: add e2e tests
OtavioStasiak d01f17a
chore: format code and fix lint issues
OtavioStasiak 76da4bc
Merge branch 'develop' into feat.authentication-bypass-via-biometric-…
OtavioStasiak f6f59cb
fix: e2e tests
OtavioStasiak 952f38a
fix: test flow
OtavioStasiak fe0d66b
refactor: encapsulate biometric trust state and speed up screen-lock E2E
OtavioStasiak 13136b6
refactor: route biometric enabled flag through trust store API
OtavioStasiak 68a257f
Merge branch 'develop' into feat.authentication-bypass-via-biometric-…
OtavioStasiak fdb2cc1
refactor(biometric-trust): encapsulate biometry toggle and clarify tr…
OtavioStasiak 256e90b
refactor(biometric-trust): type unlock outcome as discriminated union…
OtavioStasiak bc0bd7b
refactor(biometric-trust): remove dead mount-time auto-biometry and v…
OtavioStasiak 063ec62
fix(screen-lock): prompt biometry from behind the passcode modal to s…
OtavioStasiak 4e6a86e
fix(biometric-trust): mark install trust-initialized on enrol to clos…
OtavioStasiak 66ab2f8
fix(biometric-trust): restore biometry opt-in prompt on first-passcod…
OtavioStasiak 5969082
fix(biometric-trust): clear enabled flag on unavailable to fix iOS en…
OtavioStasiak b7e21c0
Merge branch 'develop' into feat.authentication-bypass-via-biometric-…
OtavioStasiak f9c2f86
chore: biometricTrustStore docs
OtavioStasiak 43c18f4
Merge branch 'develop' into feat.authentication-bypass-via-biometric-…
OtavioStasiak 80f688f
chore: format code and fix lint issues
OtavioStasiak ad26251
chore: doc improvement
OtavioStasiak dcff7c3
Merge branch 'develop' into feat.authentication-bypass-via-biometric-…
OtavioStasiak b566a47
chore: code improvements
OtavioStasiak fbfd4e2
chore: format code and fix lint issues
OtavioStasiak 050b438
Merge branch 'develop' into feat.authentication-bypass-via-biometric-…
OtavioStasiak 122bc6a
fix: persist passcode attempts across re-renders, guard toggle double…
OtavioStasiak 6bd28b6
fix: reset attempts deterministically on lockout expiry and handle mo…
OtavioStasiak 410d8b0
Merge branch 'develop' into feat.authentication-bypass-via-biometric-…
OtavioStasiak bb51c78
fix: passcode unlock and deep link cancellation regressions
OtavioStasiak f886398
Merge branch 'develop' into feat.authentication-bypass-via-biometric-…
OtavioStasiak 31d068f
Merge branch 'develop' into feat.authentication-bypass-via-biometric-…
OtavioStasiak 793262d
fix: restore screen lock and biometric trust safeguards
OtavioStasiak e752780
fix: test
OtavioStasiak 5e2c094
Merge branch 'develop' into feat.authentication-bypass-via-biometric-…
OtavioStasiak 8878a40
Merge branch 'develop' into feat.authentication-bypass-via-biometric-…
OtavioStasiak 2d03eac
fix(screen-lock): persist authentication time on unlock, not pre-moda…
OtavioStasiak dcb1087
Merge branch 'develop' into feat.authentication-bypass-via-biometric-…
OtavioStasiak 4ce34cc
Merge branch 'develop' into feat.authentication-bypass-via-biometric-…
OtavioStasiak a9a2091
chore: improve readability
OtavioStasiak b11be3c
fix: remove anti pattern useeffect and rename keys
OtavioStasiak 62c07d8
fix: md
OtavioStasiak 86d2752
fix: test
OtavioStasiak 73f8707
chore: code improvements
OtavioStasiak 3bc3409
fix: dont eject user when a cold-boot unlock is superseded
OtavioStasiak 1306620
chore: format code and fix lint issues
OtavioStasiak e776dca
fix: test
OtavioStasiak ece1cda
Merge branch 'develop' into feat.authentication-bypass-via-biometric-…
OtavioStasiak 6b0b888
Merge branch 'develop' into feat.authentication-bypass-via-biometric-…
OtavioStasiak 4664e51
fix: enforce screen lock on biometric enrollment change regardless of…
OtavioStasiak 28dc057
fix: force passcode after biometric enrollment change regardless of a…
OtavioStasiak 4d292b7
feat(android): silent keystore probe to force screen lock on biometri…
OtavioStasiak 6574cf1
fix: subtitle cutted
OtavioStasiak 926b1f8
action: organized translations
OtavioStasiak e345a35
fix(biometric): force passcode on grandfather migration to close enro…
OtavioStasiak e488408
chore: format code and fix lint issues
OtavioStasiak 4d0cec3
Merge branch 'develop' into feat.authentication-bypass-via-biometric-…
OtavioStasiak b0499cb
update test
OtavioStasiak ff8a1a3
test: cover forced relock on biometric reenrollment inside warm window
OtavioStasiak ab1bffb
refactor: migrate BiometricEnrollment native module to TurboModule
OtavioStasiak 90e9d34
refactor: dedupe enrollment-relock predicate and extract BiometricPro…
OtavioStasiak f664d1d
fix: fail closed on non-KPIE keystore errors in biometric enrollment …
OtavioStasiak f71731b
chore: format code and fix lint issues
OtavioStasiak 4694cd8
test: fix mock leak in localAuthentication biometry-consent tests
OtavioStasiak 23c5ddb
Merge branch 'develop' into feat.authentication-bypass-via-biometric-…
OtavioStasiak d026e4c
fix: persist biometric relock debt across teardown to close kill-at-p…
OtavioStasiak 3bbdb22
fix: fail closed when biometric enrollment probe is unavailable
OtavioStasiak 8bba60c
comment cleanup
OtavioStasiak ec73624
Merge branch 'develop' into feat.authentication-bypass-via-biometric-…
OtavioStasiak e0161fb
Merge branch 'develop' into feat.authentication-bypass-via-biometric-…
OtavioStasiak c39332e
rollback lock
OtavioStasiak 53d8c89
fix: merge issues
OtavioStasiak bb89748
fix: sniffler and comments
OtavioStasiak 61a4fe8
test: reduce screen-lock sleeps to 7s
OtavioStasiak 72fd12d
fix(screen-lock): require a fresh biometric on Android, not a sentine…
OtavioStasiak f6c2a07
fix(screen-lock): match errSecItemNotFound on the error code, not the…
OtavioStasiak 7d9f4b5
chore(screen-lock): restore switch exhaustiveness and fix a stale com…
OtavioStasiak 48b9020
fix(screen-lock): keep the first deferred settle instead of clobberin…
OtavioStasiak b64eceb
fix(screen-lock): clear the biometry flag even if disenroll rejects
OtavioStasiak b54eb74
fix(screen-lock): arm the relock marker before the grandfather enroll
OtavioStasiak 929506c
fix(screen-lock): require a strong biometric before enrolling trust
OtavioStasiak 227ee13
chore: format code and fix lint issues
OtavioStasiak ac570e4
docs(screen-lock): correct the probes fail-closed behaviour
OtavioStasiak 879fe0e
fix: test case 11 and 12 flaky tests (#7564)
OtavioStasiak 480419d
fix(db): move sendMessage reads and prepares inside the writer lock (…
OtavioStasiak 8dffa79
fix: Admin Panel content hidden behind bottom navigation bar (#7538)
Rohit3523 2fe55df
feat: add tabular numbers (#7568)
OtavioStasiak 74ba19a
chore: pin @rocket.chat/sdk to a specific commit hash (#7569)
Rohit3523 42ecef8
fix(e2ee): re-fetch subscription inside the write in toggleRoomE2EE (…
OtavioStasiak 1685c2e
fix: run handleDelete finds and prepares inside the writer lock (#7552)
OtavioStasiak 8859c62
fix: crop screen hidden behind navigation bar on iOS 26 (#7529)
Rohit3523 72885da
Merge branch 'develop' into feat.authentication-bypass-via-biometric-…
OtavioStasiak aa00385
chore: format code and fix lint issues
OtavioStasiak eca63f1
chore: code improvements
OtavioStasiak c7f17ea
fix: guard biometry toggle against concurrent enable/disable races
OtavioStasiak ada5fad
fix: check biometry support in toggle and surface enable failures
OtavioStasiak 2356639
action: organized translations
OtavioStasiak 93420f4
fix: arm relock debt before clearing biometry flag in migration
OtavioStasiak 6357699
refactor: pass handleLocalAuthentication args as options object
OtavioStasiak b925fba
fix: log non-cancel unlock failures instead of swallowing them
OtavioStasiak 2453751
refactor: extract logUnlessUserCanceled helper for unlock catch blocks
OtavioStasiak 980a65a
fix:translation
OtavioStasiak 2b77e60
cleanup
OtavioStasiak f5af1c5
fix(screen-lock): require a consent prompt on every biometry enable path
OtavioStasiak 8011a2c
cleanup
OtavioStasiak f07df94
Merge branch 'develop' into feat.authentication-bypass-via-biometric-…
OtavioStasiak df0d5f4
Merge branch 'develop' into feat.authentication-bypass-via-biometric-…
OtavioStasiak aeaf214
chore: format code and fix lint issues
OtavioStasiak 344e564
fix: Android biometric unlock accepting weak (Class 2) enrollments
OtavioStasiak 65b68cb
test: assert the screen lock actually lifts after the final unlock
OtavioStasiak 9202091
chore: add missing screen-lock test-map dependencies
OtavioStasiak 65883ea
test: assert the deep link unlock catch actually runs
OtavioStasiak 57d3924
fix: app stuck on splash when a deep link unlock fails
OtavioStasiak 12da794
fix: transient biometric errors permanently disenrolling users
OtavioStasiak fe2c535
fix: keystore probe failing open on a corrupted-but-readable keystore
OtavioStasiak 38828e5
fix: forced-passcode copy claiming an enrollment change that never ha…
OtavioStasiak d3cbc5f
fix: swallowed probe-key failure causing a false enrollment-change te…
OtavioStasiak e23e586
fix: the failed attempt that trips the lockout never being persisted
OtavioStasiak 29dc106
fix: a superseding passcode-choose request inheriting the previous on…
OtavioStasiak 8d6cb8f
chore: biometric trust cleanup pass — dead paths, telemetry, naming
OtavioStasiak e8b8eda
docs: drop the biometric trust comments that restate the code below them
OtavioStasiak 63160b4
Merge branch 'develop' into feat.authentication-bypass-via-biometric-…
OtavioStasiak 12d983b
Merge branch 'develop' into feat.authentication-bypass-via-biometric-…
OtavioStasiak File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,270 @@ | ||
| appId: ${APP_ID} | ||
| name: Screen Lock | ||
| onFlowStart: | ||
| - runFlow: '../../helpers/setup.yaml' | ||
| onFlowComplete: | ||
| - evalScript: ${output.utils.deleteCreatedUsers()} | ||
| tags: | ||
| - test-8 | ||
|
|
||
| --- | ||
| - evalScript: ${output.user = output.utils.createUser()} | ||
| - runFlow: | ||
| file: '../../helpers/login-with-deeplink.yaml' | ||
| env: | ||
| USERNAME: ${output.user.username} | ||
| PASSWORD: ${output.user.password} | ||
|
|
||
| # Navigate to Screen Lock config | ||
| - extendedWaitUntil: | ||
| visible: | ||
| id: 'rooms-list-view' | ||
| timeout: 60000 | ||
| - tapOn: | ||
| id: 'rooms-list-view-sidebar' | ||
| - extendedWaitUntil: | ||
| visible: | ||
| id: 'sidebar-settings' | ||
| timeout: 60000 | ||
| - tapOn: | ||
| id: 'sidebar-settings' | ||
| - extendedWaitUntil: | ||
| visible: | ||
| id: 'settings-view-security-privacy' | ||
| timeout: 60000 | ||
| - tapOn: | ||
| id: 'settings-view-security-privacy' | ||
| - extendedWaitUntil: | ||
| visible: | ||
| id: 'security-privacy-view-screen-lock' | ||
| timeout: 60000 | ||
| - tapOn: | ||
| id: 'security-privacy-view-screen-lock' | ||
| - extendedWaitUntil: | ||
| visible: | ||
| id: 'screen-lock-config-view' | ||
| timeout: 60000 | ||
|
|
||
| # Enable "Unlock with passcode" -> opens PasscodeChoose | ||
| - tapOn: | ||
| id: 'screen-lock-config-view-auto-lock' | ||
| - extendedWaitUntil: | ||
| visible: | ||
| id: 'passcode-button-1' | ||
| timeout: 60000 | ||
|
|
||
| # Choose passcode 123456 | ||
| - tapOn: | ||
| id: 'passcode-button-1' | ||
| - tapOn: | ||
| id: 'passcode-button-2' | ||
| - tapOn: | ||
| id: 'passcode-button-3' | ||
| - tapOn: | ||
| id: 'passcode-button-4' | ||
| - tapOn: | ||
| id: 'passcode-button-5' | ||
| - tapOn: | ||
| id: 'passcode-button-6' | ||
|
|
||
| # Confirm passcode 123456 | ||
| - extendedWaitUntil: | ||
| visible: | ||
| text: 'Confirm your new passcode' | ||
| timeout: 60000 | ||
| - tapOn: | ||
| id: 'passcode-button-1' | ||
| - tapOn: | ||
| id: 'passcode-button-2' | ||
| - tapOn: | ||
| id: 'passcode-button-3' | ||
| - tapOn: | ||
| id: 'passcode-button-4' | ||
| - tapOn: | ||
| id: 'passcode-button-5' | ||
| - tapOn: | ||
| id: 'passcode-button-6' | ||
|
|
||
| # Back on Screen Lock config; choose "After 1 minute" | ||
| - extendedWaitUntil: | ||
| visible: | ||
| id: 'screen-lock-config-view-auto-lock-time-60' | ||
| timeout: 60000 | ||
| - tapOn: | ||
| id: 'screen-lock-config-view-auto-lock-time-60' | ||
|
|
||
| # Background the app, wait past the auto-lock interval, relaunch. | ||
| - pressKey: Home | ||
| - evalScript: ${output.utils.sleep(7000)} | ||
| - launchApp: | ||
| appId: ${APP_ID} | ||
|
|
||
| # Screen Lock modal must appear; unlock with current passcode | ||
| - extendedWaitUntil: | ||
| visible: | ||
| id: 'passcode-button-1' | ||
| timeout: 60000 | ||
| - tapOn: | ||
| id: 'passcode-button-1' | ||
| - tapOn: | ||
| id: 'passcode-button-2' | ||
| - tapOn: | ||
| id: 'passcode-button-3' | ||
| - tapOn: | ||
| id: 'passcode-button-4' | ||
| - tapOn: | ||
| id: 'passcode-button-5' | ||
| - tapOn: | ||
| id: 'passcode-button-6' | ||
|
|
||
| # launchApp cold-starts, so unlocking lands on the rooms list. Navigate back to Screen Lock config. | ||
| - extendedWaitUntil: | ||
| visible: | ||
| id: 'rooms-list-view' | ||
| timeout: 60000 | ||
| - tapOn: | ||
| id: 'rooms-list-view-sidebar' | ||
| - extendedWaitUntil: | ||
| visible: | ||
| id: 'sidebar-settings' | ||
| timeout: 60000 | ||
| - tapOn: | ||
| id: 'sidebar-settings' | ||
| - extendedWaitUntil: | ||
| visible: | ||
| id: 'settings-view-security-privacy' | ||
| timeout: 60000 | ||
| - tapOn: | ||
| id: 'settings-view-security-privacy' | ||
| - extendedWaitUntil: | ||
| visible: | ||
| id: 'security-privacy-view-screen-lock' | ||
| timeout: 60000 | ||
| - tapOn: | ||
| id: 'security-privacy-view-screen-lock' | ||
|
|
||
| # Entering the Screen Lock screen requires re-auth (PR #4052); unlock with current passcode | ||
| - extendedWaitUntil: | ||
| visible: | ||
| id: 'passcode-button-1' | ||
| timeout: 60000 | ||
| - tapOn: | ||
| id: 'passcode-button-1' | ||
| - tapOn: | ||
| id: 'passcode-button-2' | ||
| - tapOn: | ||
| id: 'passcode-button-3' | ||
| - tapOn: | ||
| id: 'passcode-button-4' | ||
| - tapOn: | ||
| id: 'passcode-button-5' | ||
| - tapOn: | ||
| id: 'passcode-button-6' | ||
|
|
||
| - extendedWaitUntil: | ||
| visible: | ||
| id: 'screen-lock-config-view' | ||
| timeout: 60000 | ||
| - extendedWaitUntil: | ||
| visible: | ||
| id: 'screen-lock-config-view-change-passcode' | ||
| timeout: 60000 | ||
| - tapOn: | ||
| id: 'screen-lock-config-view-change-passcode' | ||
|
|
||
| # Re-authenticate with current passcode (autoLock is on -> handleLocalAuthentication) | ||
| - extendedWaitUntil: | ||
| visible: | ||
| id: 'passcode-button-1' | ||
| timeout: 60000 | ||
| - tapOn: | ||
| id: 'passcode-button-1' | ||
| - tapOn: | ||
| id: 'passcode-button-2' | ||
| - tapOn: | ||
| id: 'passcode-button-3' | ||
| - tapOn: | ||
| id: 'passcode-button-4' | ||
| - tapOn: | ||
| id: 'passcode-button-5' | ||
| - tapOn: | ||
| id: 'passcode-button-6' | ||
|
|
||
| # Now the ChangePasscodeView (PasscodeChoose) opens; choose new passcode 345678 | ||
| - extendedWaitUntil: | ||
| visible: | ||
| text: 'Choose your new passcode' | ||
| timeout: 60000 | ||
| - tapOn: | ||
| id: 'passcode-button-3' | ||
| - tapOn: | ||
| id: 'passcode-button-4' | ||
| - tapOn: | ||
| id: 'passcode-button-5' | ||
| - tapOn: | ||
| id: 'passcode-button-6' | ||
| - tapOn: | ||
| id: 'passcode-button-7' | ||
| - tapOn: | ||
| id: 'passcode-button-8' | ||
|
|
||
| # Confirm new passcode 345678 | ||
| - extendedWaitUntil: | ||
| visible: | ||
| text: 'Confirm your new passcode' | ||
| timeout: 60000 | ||
| - tapOn: | ||
| id: 'passcode-button-3' | ||
| - tapOn: | ||
| id: 'passcode-button-4' | ||
| - tapOn: | ||
| id: 'passcode-button-5' | ||
| - tapOn: | ||
| id: 'passcode-button-6' | ||
| - tapOn: | ||
| id: 'passcode-button-7' | ||
| - tapOn: | ||
| id: 'passcode-button-8' | ||
|
|
||
| # Modal closes; we are back on the Screen Lock config screen | ||
| - extendedWaitUntil: | ||
| visible: | ||
| id: 'screen-lock-config-view' | ||
| timeout: 60000 | ||
| - assertVisible: | ||
| id: 'screen-lock-config-view-change-passcode' | ||
|
|
||
| # Background the app, wait past the auto-lock interval, relaunch. | ||
| - pressKey: Home | ||
| - evalScript: ${output.utils.sleep(7000)} | ||
| - launchApp: | ||
| appId: ${APP_ID} | ||
|
|
||
| # Screen Lock modal must appear; unlock with current passcode | ||
| - extendedWaitUntil: | ||
| visible: | ||
| id: 'passcode-button-3' | ||
| timeout: 60000 | ||
| - tapOn: | ||
| id: 'passcode-button-3' | ||
| - tapOn: | ||
| id: 'passcode-button-4' | ||
| - tapOn: | ||
| id: 'passcode-button-5' | ||
| - tapOn: | ||
| id: 'passcode-button-6' | ||
| - tapOn: | ||
| id: 'passcode-button-7' | ||
| - tapOn: | ||
| id: 'passcode-button-8' | ||
|
OtavioStasiak marked this conversation as resolved.
|
||
|
|
||
| # The taps above pass whether or not the app accepts the digits, so assert the lock actually lifted. | ||
| # launchApp cold-starts, so navigation resets to the rooms list rather than the Screen Lock screen. | ||
| - extendedWaitUntil: | ||
| notVisible: | ||
| id: 'passcode-button-3' | ||
| timeout: 60000 | ||
| - extendedWaitUntil: | ||
| visible: | ||
| id: 'rooms-list-view' | ||
| timeout: 60000 | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.