password_manager.h revision f8ee788a64d60abd8f2d742a5fdedde054ecd910
1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_PASSWORD_MANAGER_H_
6#define COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_PASSWORD_MANAGER_H_
7
8#include <vector>
9
10#include "base/callback.h"
11#include "base/memory/scoped_ptr.h"
12#include "base/memory/scoped_vector.h"
13#include "base/observer_list.h"
14#include "base/prefs/pref_member.h"
15#include "base/stl_util.h"
16#include "components/autofill/core/common/password_form.h"
17#include "components/autofill/core/common/password_form_fill_data.h"
18#include "components/password_manager/core/browser/login_model.h"
19#include "components/password_manager/core/browser/password_form_manager.h"
20
21class PrefRegistrySimple;
22
23namespace content {
24class WebContents;
25}
26
27namespace user_prefs {
28class PrefRegistrySyncable;
29}
30
31namespace password_manager {
32
33class BrowserSavePasswordProgressLogger;
34class PasswordManagerClient;
35class PasswordManagerDriver;
36class PasswordManagerTest;
37class PasswordFormManager;
38
39// Per-tab password manager. Handles creation and management of UI elements,
40// receiving password form data from the renderer and managing the password
41// database through the PasswordStore. The PasswordManager is a LoginModel
42// for purposes of supporting HTTP authentication dialogs.
43class PasswordManager : public LoginModel {
44 public:
45  static const char kOtherPossibleUsernamesExperiment[];
46
47  static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
48#if defined(OS_WIN)
49  static void RegisterLocalPrefs(PrefRegistrySimple* registry);
50#endif
51  explicit PasswordManager(PasswordManagerClient* client);
52  virtual ~PasswordManager();
53
54  typedef base::Callback<void(const autofill::PasswordForm&)>
55      PasswordSubmittedCallback;
56
57  // There is no corresponding remove function as currently all of the
58  // owners of these callbacks have sufficient lifetimes so that the callbacks
59  // should always be valid when called.
60  void AddSubmissionCallback(const PasswordSubmittedCallback& callback);
61
62  // Is saving new data for password autofill enabled for the current profile
63  // and page? For example, saving new data is disabled in Incognito mode,
64  // whereas filling data is not. Also, saving data is disabled in the presence
65  // of SSL errors on a page.
66  bool IsSavingEnabledForCurrentPage() const;
67
68  // Called by a PasswordFormManager when it decides a form can be autofilled
69  // on the page.
70  virtual void Autofill(const autofill::PasswordForm& form_for_autofill,
71                        const autofill::PasswordFormMap& best_matches,
72                        const autofill::PasswordForm& preferred_match,
73                        bool wait_for_username) const;
74
75  // LoginModel implementation.
76  virtual void AddObserver(LoginModelObserver* observer) OVERRIDE;
77  virtual void RemoveObserver(LoginModelObserver* observer) OVERRIDE;
78
79  // Mark this form as having a generated password.
80  void SetFormHasGeneratedPassword(const autofill::PasswordForm& form);
81
82  // TODO(isherman): This should not be public, but is currently being used by
83  // the LoginPrompt code.
84  // When a form is submitted, we prepare to save the password but wait
85  // until we decide the user has successfully logged in. This is step 1
86  // of 2 (see SavePassword).
87  void ProvisionallySavePassword(const autofill::PasswordForm& form);
88
89  // Should be called when the user navigates the main frame.
90  void DidNavigateMainFrame(bool is_in_page);
91
92  // Handles password forms being parsed.
93  void OnPasswordFormsParsed(
94      const std::vector<autofill::PasswordForm>& forms);
95
96  // Handles password forms being rendered.
97  void OnPasswordFormsRendered(
98      const std::vector<autofill::PasswordForm>& visible_forms);
99
100  // Handles a password form being submitted.
101  virtual void OnPasswordFormSubmitted(
102      const autofill::PasswordForm& password_form);
103
104  PasswordManagerClient* client() { return client_; }
105
106 private:
107  enum ProvisionalSaveFailure {
108    SAVING_DISABLED,
109    EMPTY_PASSWORD,
110    NO_MATCHING_FORM,
111    MATCHING_NOT_COMPLETE,
112    FORM_BLACKLISTED,
113    INVALID_FORM,
114    AUTOCOMPLETE_OFF,
115    MAX_FAILURE_VALUE
116  };
117
118  // Log failure for UMA. Logs additional metrics if the |form_origin|
119  // corresponds to one of the top, explicitly monitored websites. For some
120  // values of |failure| also sends logs to the internals page through |logger|,
121  // it |logger| is not NULL.
122  void RecordFailure(ProvisionalSaveFailure failure,
123                     const std::string& form_origin,
124                     BrowserSavePasswordProgressLogger* logger);
125
126  // Possibly set up FieldTrial for testing other possible usernames. This only
127  // happens if there are other_possible_usernames to be shown and the
128  // experiment hasn't already been initialized. We setup the experiment at
129  // such a late time because this experiment will only affect a small number
130  // of users so we want to include a larger fraction of these users than the
131  // normal 10%.
132  void PossiblyInitializeUsernamesExperiment(
133      const autofill::PasswordFormMap& matches) const;
134
135  // Returns true if we can show possible usernames to users in cases where
136  // the username for the form is ambigious.
137  bool OtherPossibleUsernamesEnabled() const;
138
139  // Returns true if the user needs to be prompted before a password can be
140  // saved (instead of automatically saving
141  // the password), based on inspecting the state of
142  // |provisional_save_manager_|.
143  bool ShouldPromptUserToSavePassword() const;
144
145  // Note about how a PasswordFormManager can transition from
146  // pending_login_managers_ to provisional_save_manager_ and the infobar.
147  //
148  // 1. form "seen"
149  //       |                                             new
150  //       |                                               ___ Infobar
151  // pending_login -- form submit --> provisional_save ___/
152  //             ^                            |           \___ (update DB)
153  //             |                           fail
154  //             |-----------<------<---------|          !new
155  //
156  // When a form is "seen" on a page, a PasswordFormManager is created
157  // and stored in this collection until user navigates away from page.
158
159  ScopedVector<PasswordFormManager> pending_login_managers_;
160
161  // When the user submits a password/credential, this contains the
162  // PasswordFormManager for the form in question until we deem the login
163  // attempt to have succeeded (as in valid credentials). If it fails, we
164  // send the PasswordFormManager back to the pending_login_managers_ set.
165  // Scoped in case PasswordManager gets deleted (e.g tab closes) between the
166  // time a user submits a login form and gets to the next page.
167  scoped_ptr<PasswordFormManager> provisional_save_manager_;
168
169  // The embedder-level client. Must outlive this class.
170  PasswordManagerClient* const client_;
171
172  // The platform-level driver. Must outlive this class.
173  PasswordManagerDriver* const driver_;
174
175  // Set to false to disable the password manager (will no longer ask if you
176  // want to save passwords but will continue to fill passwords).
177  BooleanPrefMember password_manager_enabled_;
178
179  // Observers to be notified of LoginModel events.  This is mutable to allow
180  // notification in const member functions.
181  mutable ObserverList<LoginModelObserver> observers_;
182
183  // Callbacks to be notified when a password form has been submitted.
184  std::vector<PasswordSubmittedCallback> submission_callbacks_;
185
186  DISALLOW_COPY_AND_ASSIGN(PasswordManager);
187};
188
189}  // namespace password_manager
190
191#endif  // COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_PASSWORD_MANAGER_H_
192