File: manage_passwords_state.h

package info (click to toggle)
chromium 138.0.7204.183-1~deb12u1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm-proposed-updates
  • size: 6,080,960 kB
  • sloc: cpp: 34,937,079; ansic: 7,176,967; javascript: 4,110,704; python: 1,419,954; asm: 946,768; xml: 739,971; pascal: 187,324; sh: 89,623; perl: 88,663; objc: 79,944; sql: 50,304; cs: 41,786; fortran: 24,137; makefile: 21,811; php: 13,980; tcl: 13,166; yacc: 8,925; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (231 lines) | stat: -rw-r--r-- 8,682 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
// Copyright 2015 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_UI_PASSWORDS_MANAGE_PASSWORDS_STATE_H_
#define CHROME_BROWSER_UI_PASSWORDS_MANAGE_PASSWORDS_STATE_H_

#include <memory>
#include <optional>
#include <vector>

#include "base/functional/callback.h"
#include "base/memory/raw_ptr.h"
#include "components/password_manager/core/browser/password_form.h"
#include "components/password_manager/core/browser/password_store/password_store_change.h"
#include "components/password_manager/core/common/credential_manager_types.h"
#include "components/password_manager/core/common/password_manager_ui.h"

namespace password_manager {
class PasswordFormManagerForUI;
class PasswordManagerClient;
}  // namespace password_manager

// ManagePasswordsState keeps the current state for ManagePasswordsUIController
// as well as up-to-date data for this state.
class ManagePasswordsState {
 public:
  using CredentialsCallback =
      base::OnceCallback<void(const password_manager::PasswordForm*)>;

  ManagePasswordsState();

  ManagePasswordsState(const ManagePasswordsState&) = delete;
  ManagePasswordsState& operator=(const ManagePasswordsState&) = delete;

  ~ManagePasswordsState();

  // The embedder of this class has to set the client for logging.
  void set_client(password_manager::PasswordManagerClient* client) {
    client_ = client;
  }

  password_manager::PasswordManagerClient* client() const { return client_; }

  // The methods below discard the current state/data of the object and move it
  // to the specified state.

  // Move to PENDING_PASSWORD_STATE.
  void OnPendingPassword(
      std::unique_ptr<password_manager::PasswordFormManagerForUI> form_manager);

  // Move to PENDING_PASSWORD_UPDATE_STATE.
  void OnUpdatePassword(
      std::unique_ptr<password_manager::PasswordFormManagerForUI> form_manager);

  // Move to CREDENTIAL_REQUEST_STATE.
  void OnRequestCredentials(
      std::vector<std::unique_ptr<password_manager::PasswordForm>>
          local_credentials,
      const url::Origin& origin);

  // Move to AUTO_SIGNIN_STATE. |local_forms| can't be empty.
  void OnAutoSignin(
      std::vector<std::unique_ptr<password_manager::PasswordForm>> local_forms,
      const url::Origin& origin);

  // Move to SAVE_CONFIRMATION_STATE.
  void OnAutomaticPasswordSave(
      std::unique_ptr<password_manager::PasswordFormManagerForUI> form_manager);

  // Move to |state|. Updates local_credentials_forms_ to contain pending
  // credentials.|form_to_update| will be excluded from the confirmation
  // management bubble as it contains outdated data.
  void OnSubmittedGeneratedPassword(
      password_manager::ui::State state,
      std::unique_ptr<password_manager::PasswordFormManagerForUI> form_manager,
      password_manager::PasswordForm form_to_update =
          password_manager::PasswordForm());

  // Move to MANAGE_STATE or INACTIVE_STATE for PSL matched passwords.
  // |password_forms| contains best matches from the password store for the
  // form which was autofilled, |origin| is an origin of the form which was
  // autofilled. In addition, |federated_matches|, contains stored federated
  // credentials, if any, to show to the user as well.
  void OnPasswordAutofilled(
      base::span<const password_manager::PasswordForm> password_forms,
      url::Origin origin,
      base::span<const password_manager::PasswordForm> federated_matches);

  // Move to INACTIVE_STATE.
  void OnInactive();

  // Move to KEYCHAIN_ERROR_STATE.
  void OnKeychainError();

  // Move to PASSKEY_SAVED_CONFIRMATION_STATE. Stores whether GPM pin was
  // created in the same flow and the passkey's RP ID.
  void OnPasskeySaved(bool gpm_pin_created, std::string passkey_rp_id);

  // Move to PASSKEY_DELETED_CONFIRMATION_STATE.
  void OnPasskeyDeleted();

  // Move to PASSKEY_UPDATED_CONFIRMATION_STATE. Stores the passkey's RP ID.
  void OnPasskeyUpdated(std::string passkey_rp_id);

  // Move to PASSKEY_NOT_ACCEPTED_STATE. Stores the passkey's RP ID.
  void OnPasskeyNotAccepted(std::string passkey_rp_id);

  // Move to PASSKEY_UPGRADE_STATE. Stores the passkey's RP ID.
  void OnPasskeyUpgrade(std::string passkey_rp_id);

  // Move to MOVE_CREDENTIAL_AFTER_LOG_IN_STATE. Triggers a bubble to move the
  // just submitted form to the user's account store.
  void OnPasswordMovable(
      std::unique_ptr<password_manager::PasswordFormManagerForUI> form_to_move);

  // Moves the object to |state| without resetting the internal data. Allowed:
  // * -> MANAGE_STATE
  // * -> PASSWORD_UPDATED_*
  void TransitionToState(password_manager::ui::State state);

  // Updates the internal state applying |changes|.
  void ProcessLoginsChanged(
      const password_manager::PasswordStoreChangeList& changes);

  void ProcessUnsyncedCredentialsWillBeDeleted(
      std::vector<password_manager::PasswordForm> unsynced_credentials);

  // Called when the user chooses a credential. |form| is passed to the
  // credentials callback. Method should be called in the
  // CREDENTIAL_REQUEST_STATE state.
  void ChooseCredential(const password_manager::PasswordForm* form);

  // Move to MANAGE_STATE with initial credential to show its details.
  void OpenPasswordDetailsBubble(const password_manager::PasswordForm& form);

  password_manager::ui::State state() const { return state_; }
  const std::vector<password_manager::PasswordForm>& unsynced_credentials()
      const {
    return unsynced_credentials_;
  }
  const url::Origin& origin() const { return origin_; }
  password_manager::PasswordFormManagerForUI* form_manager() const {
    return form_manager_.get();
  }
  const CredentialsCallback& credentials_callback() {
    return credentials_callback_;
  }
  void set_credentials_callback(CredentialsCallback callback) {
    credentials_callback_ = std::move(callback);
  }

  password_manager::PasswordForm* selected_password() const {
    return selected_password_.get();
  }
  void set_selected_password(
      std::unique_ptr<password_manager::PasswordForm> form) {
    selected_password_ = std::move(form);
  }
  void clear_selected_password() { selected_password_.reset(); }

  const std::optional<password_manager::PasswordForm>&
  single_credential_mode_credential() const {
    return single_credential_mode_credential_;
  }

  bool gpm_pin_created_during_recent_passkey_creation() const {
    return gpm_pin_created_during_recent_passkey_creation_;
  }

  const std::string& passkey_rp_id() const { return passkey_rp_id_; }

  // Current local forms. ManagePasswordsState is responsible for the forms.
  const std::vector<std::unique_ptr<password_manager::PasswordForm>>&
  GetCurrentForms() const {
    return local_credentials_forms_;
  }

  void ClearSingleCredentialModeCredential() {
    single_credential_mode_credential_ = std::nullopt;
  }

 private:
  // Removes all the PasswordForms and resets passkey state stored in this
  // object.
  void ClearData();

  // Adds |form| to the internal state if it's relevant.
  bool AddForm(const password_manager::PasswordForm& form);

  void SetState(password_manager::ui::State state);

  // The origin of the current page for which the state is stored. It's used to
  // determine which PasswordStore changes are applicable to the internal state.
  url::Origin origin_;

  // Contains the password that was submitted.
  std::unique_ptr<password_manager::PasswordFormManagerForUI> form_manager_;

  // Contains password selected for moving to the account.
  std::unique_ptr<password_manager::PasswordForm> selected_password_;

  // The credential for the bubble in the single credential mode.
  std::optional<password_manager::PasswordForm>
      single_credential_mode_credential_;

  // Contains all the current forms.
  std::vector<std::unique_ptr<password_manager::PasswordForm>>
      local_credentials_forms_;

  // Contains any non synced credentials.
  std::vector<password_manager::PasswordForm> unsynced_credentials_;

  // A callback to be invoked when user selects a credential.
  CredentialsCallback credentials_callback_;

  // The current state of the password manager UI.
  password_manager::ui::State state_;

  // The client used for logging.
  raw_ptr<password_manager::PasswordManagerClient, AcrossTasksDanglingUntriaged>
      client_;

  // Whether GPM pin was created in the same flow as recent passkey creation.
  bool gpm_pin_created_during_recent_passkey_creation_ = false;

  // The passkey relying party identifier used during a recent passkey flow.
  std::string passkey_rp_id_;
};

#endif  // CHROME_BROWSER_UI_PASSWORDS_MANAGE_PASSWORDS_STATE_H_