chromium/chrome/browser/webauthn/change_pin_controller_impl.h

// 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_