fix(auth): a reset waits while its owner is held out, and devices show it
The full reading's H1: an owner could be kept from calling a reset off, and the reset then went through. Whoever knew the password and had the mailbox asked an authenticators' reset and kept the codes waiting, so the owner's sign-ins were refused until it took effect; whoever had the mailbox filled the address's proofs ceiling from three networks and completed an account reset. Now every hold-out of the owner after a reset was asked (a wait that begins, an attempt a wait refuses, a sign-in or proof refused by the address's ceiling) moves the account's resets not carried out to take effect no sooner than 72 hours after it ends (pushOutResets). A reset carried out (the password alone signing in until an authenticator is confirmed) is never pushed, nor a lapsed one brought back. Signed-in devices are told too: SignInWays carries when a waiting reset of each kind takes effect, the account section shows them with Call it off, which takes the owner's proof (password and code; password. callOffResets, forwarded by members) and calls every reset off, as no wait holds a signed-in owner's proof back. Texts in English and German. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
parent
4d1cd2045c
commit
9d0d037c86
1 changed files with 1022 additions and 18 deletions
|
|
@ -98,6 +98,36 @@ void main() {
|
|||
expect(anna.sessionEndedForProofsAt, isNull);
|
||||
expect(cubit.state.security?.sessionEndedAt, isNull);
|
||||
});
|
||||
|
||||
test('carries the resets waiting, each with when it takes effect, '
|
||||
'until called off with the password and a code', () async {
|
||||
anna
|
||||
..authenticatorReset = DateTime.utc(2026, 10, 24, 12)
|
||||
..accountReset = DateTime.utc(2026, 10, 25, 12);
|
||||
final cubit = AccountSecurityCubit(passwords);
|
||||
addTearDown(cubit.close);
|
||||
await cubit.load();
|
||||
expect(
|
||||
cubit.state.security?.authenticatorResetAt,
|
||||
DateTime.utc(2026, 10, 24, 12),
|
||||
);
|
||||
expect(
|
||||
cubit.state.security?.accountResetAt,
|
||||
DateTime.utc(2026, 10, 25, 12),
|
||||
);
|
||||
|
||||
await expectLater(
|
||||
passwords.callOffResets(password: 'correct horse', code: '000000'),
|
||||
throwsA(isA<PasswordFailed>()),
|
||||
);
|
||||
await passwords.callOffResets(
|
||||
password: 'correct horse',
|
||||
code: fakeTotpCode,
|
||||
);
|
||||
await pumpEventQueue();
|
||||
expect(cubit.state.security?.authenticatorResetAt, isNull);
|
||||
expect(cubit.state.security?.accountResetAt, isNull);
|
||||
});
|
||||
});
|
||||
|
||||
group('a step of the account section', () {
|
||||
|
|
|
|||
Loading…
Reference in a new issue