// Copyright 2024 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CHROME_BROWSER_WEBAUTHN_CHANGE_PIN_CONTROLLER_IMPL_H_ #define CHROME_BROWSER_WEBAUTHN_CHANGE_PIN_CONTROLLER_IMPL_H_ #include <memory> #include <optional> #include <string> #include "base/memory/raw_ptr.h" #include "base/memory/weak_ptr.h" #include "base/scoped_observation.h" #include "chrome/browser/webauthn/authenticator_request_dialog_model.h" #include "chrome/browser/webauthn/change_pin_controller.h" #include "content/public/browser/document_user_data.h" namespace content { class RenderFrameHost; } // namespace content struct AuthenticatorRequestDialogModel; class EnclaveManager; // ChangePinControllerImpl controls the Google Password Manager PIN flow. // It relies heavily on the AuthenticatorRequestDialogModel's state machine. // The following diagram should help understand the flow. To edit the dialog, // paste it in asciiflow.com. // // ChangePinController AuthenticatorRequestDialogModel // ┌─────────────────────────────────┐ ┌─────────────────────────┐ // │ │ │ │ // │ StartChangePin ─────────────────┼─────────────┼───────────┐ │ // │ │ │ │ │ // │ │ Cancelled │ ▼ │ // │ OnRecoverSecurityDomainClosed ◄─┼─────────────┼── kGpmReauthForPinReset │ // │ │ │ │ │ // │ ┌────────────────────────┼─────────────┼───────────┘ │ // │ │ │ Success │ │ // │ ▼ │ │ │ // │ OnReauthComplete ───────────────┼─────────────┼───────────┐ │ // │ │ │ │ │ // │ │ Cancelled │ ▼ │ // │ CancelAuthenticatorRequest ◄────┼─────────────┼── kGPMChangePin* │ // │ │ │ │ │ // │ │ PIN entered │ │ │ // │ ┌────────────────────────┼─────────────┼───────────┘ │ // │ │ │ │ │ // │ ▼ │ └─────────────────────────┘ // │ OnGPMPinEntered ────────────────┼─────┐ EnclaveManager // │ │ │ ┌────────────────┐ // │ │ │ │ │ // │ │ │ │ │ // │ │ └───────┼─► ChangePIN │ // │ success/failure │ │ │ │ // │ ┌────────────────────────┼─────────────┼──────┘ │ // │ ▼ │ │ │ // │ │ │ │ // │ OnGpmPinChanged │ │ │ // │ │ │ │ // └─────────────────────────────────┘ └────────────────┘ // // *: this can also be kGPMChangeArbitraryPin when the user switches the step in // the view. class ChangePinControllerImpl : public ChangePinController, public content::DocumentUserData<ChangePinControllerImpl>, public AuthenticatorRequestDialogModel::Observer { … }; #endif // CHROME_BROWSER_WEBAUTHN_CHANGE_PIN_CONTROLLER_IMPL_H_