* 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
134 lines
9.9 KiB
TypeScript
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;
|