Files
element-web/src/Views.ts
Richard van der Hoff 04cf53e7aa Fix bug which caused app not to load correctly when force_verification is enabled (#31265)
* MatrixChat: add a load of logging for view transitions

This stuff was essentially impossible to follow and debug. I think a load of
logging will help.

* Add more comments on `state.view`

* Add a new state between LOADING/SOFT_LOGOUT and LOGGED_IN

... so that we can transition into COMPLETE_SECURITY without going via
LOGGED_IN.

* Remove redundant check for `force_verification`

This check was previously necessary to keep the tests working, because:

 * onLoggedIn would call `onShowPostLoginScreen`,
 * which (without the check) would call `showScreenAfterLogin`
 * which would queue up an action `Action.ViewHomePage`
 * Then we would receive an already-queued `ClientStarted` action, which would
   transition us (correctly) to the `COMPLETE_SECURITY` view
 * Then we would receive the `ViewHomePage` action, taking us back to `LOGGED_IN`.

I don't think the check was necessary in practice, because in practice there
would be enough delay between the OnLoggedIn and ClientStarted actions that the
race didn't happen.

The *problem* with the check was that it meant that, whenever
`force_verification` was enabled, we would get stuck in the LOADING state.

The check is now unnecessary, because `onLoggedIn` no longer calls
`onShowPostLoginScreen`.

* `onShowPostLoginScreen` need no longer be `async`

* Regression test for https://github.com/element-hq/element-web/issues/31203
2025-12-02 11:14:00 +00:00

134 lines
9.9 KiB
TypeScript

/*
Copyright 2024 New Vector Ltd.
Copyright 2022 The Matrix.org Foundation C.I.C.
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial
Please see LICENSE files in the repository root for full details.
*/
/**
* Constants for MatrixChat.state.view.
*
* The `View` is the primary state machine of the application: it has different states for the various setup flows
* that the user may find themselves in. Once we have a functioning client, we can transition to the `LOGGED_IN` state
* which is the "normal" state of the application.
*
* An incomplete state transition diagram follows.
*
* (initial state)
* ┌─────────────────┐ Lock held by other instance ┌─────────────────┐
* │ LOADING │─────────────────────────────►│ CONFIRM_LOCK_ │
* │ │◄─────────────────────────────│ THEFT │
* └─────────────────┘ Lock theft confirmed └─────────────────┘
* Session recovered │ │ │ Token/OIDC login succeeded
* ┌──────────────┘ │ └──────────────────────────────────────────────────────────────────┐
* │ └───────────────────────────────────────────┐ │
* │ │ No previous session │
* │ ▼ │
* │ (from all other states ┌─────────────────┐ │
* │ except LOCK_STOLEN) │ WELCOME │ │
* │ │ │ │ │
* │ │ Client logged out └─────────────────┘ │
* │ │ │ │ │
* │ └──────────────────────────┐ "Sign in" │ │ "Create account" │
* │ │ ┌────────────┘ └──────────────┐ │
* │ │ │ │ │
* │ "Forgot ▼ ▼ "Create an ▼ │
* │ ┌─────────────────┐ password" ┌─────────────────┐ account" ┌─────────────────┐ │
* │ │ FORGOT_PASSWORD │◄───────────────│ LOGIN │───────────────►│ REGISTER │ │
* │ │ │───────────────►│ │◄───────────────│ │ │
* │ └─────────────────┘ Complete / └─────────────────┘ "Sign in here" └─────────────────┘ │
* │ ▲ "Sign in instead" │ │ │
* │ │ └──────────────────────┐ ┌─────────┘ │
* │ │"Forgotten your │ │ ┌──────────────────┘
* │ │ password?" │ │ │
* │ │ │ │ │
* │ ┌─────────────────┐ Soft-logout error │ │ │
* │ │ SOFT_LOGOUT │◄───────────── (from all other states │ │ │
* │ │ │ except LOCK_STOLEN) │ │ │
* │ └─────────────────┘ │ │ │
* │ │ Re-authentication succeeded ▼ ▼ ▼
* │ │ ┌──────────────────┐
* ▼ ▼ │ (postLoginSetup) │
* ┌─────────────────┐ └──────────────────┘
* │ PENDING_CLIENT_ │ Account has │ │ │ Account lacks
* │ START │ cross-signing │ │ │ cross-signing
* └─────────────────┘ keys │ │ │ keys
* │ │ │ │ │
* │ └───────────────────────────────┐ │ │ │
* │ Client started, │ │ │ └──────┐
* │ force_verification pending │ │ │ │
* │ ▼ │ │ │
* │ Client started, ┌─────────────────┐ │ │ │
* │ force_verification │ COMPLETE_ │◄────────────┘ │ ▼
* │ not needed │ SECURITY │ │ ┌─────────────────┐
* │ └─────────────────┘ │ │ E2E_SETUP │
* │ │ │ │ │
* │ ┌─────────────────────────────────────┘ E2EE not enabled │ └─────────────────┘
* │ │ ┌─────────────────────────────────────────────────────────────┘ │
* │ │ │ ┌──────────────────────────────────────────────────────────────────────┘
* │ │ │ │
* │ │ │ │
* │ │ │ │
* │ │ │ │
* ▼ ▼ ▼ ▼
* ┌─────────────────┐
* │ LOGGED_IN │
* │ │
* └─────────────────┘
*
* (from all other states)
* │
* │ Session lock stolen
* ▼
* ┌─────────────────┐
* │ LOCK_STOLEN │
* │ │
* └─────────────────┘
*/
enum Views {
// a special initial state which is only used at startup, while we are
// trying to re-animate a matrix client or register as a guest.
LOADING,
// Another tab holds the lock.
CONFIRM_LOCK_THEFT,
// we are showing the welcome view
WELCOME,
// we are showing the login view
LOGIN,
// we are showing the registration view
REGISTER,
// showing the 'forgot password' view
FORGOT_PASSWORD,
// showing flow to trust this new device with cross-signing
COMPLETE_SECURITY,
// flow to setup SSSS / cross-signing on this account
E2E_SETUP,
/**
* We have successfully recovered a session from localstorage, but the client
* has not yet been started.
*/
PENDING_CLIENT_START,
// we are logged in with an active matrix client. The logged_in state also
// includes guests users as they too are logged in at the client level.
LOGGED_IN,
// We are logged out (invalid token) but have our local state again. The user
// should log back in to rehydrate the client.
SOFT_LOGOUT,
// Another instance of the application has started up. We just show an error page.
LOCK_STOLEN,
}
export default Views;