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
|
// Copyright 2013 The Chromium Authors. All rights reserved.
// 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_PASSWORD_MANAGER_PRESENTER_H_
#define CHROME_BROWSER_UI_PASSWORDS_PASSWORD_MANAGER_PRESENTER_H_
#include <stddef.h>
#include <map>
#include <memory>
#include <string>
#include <vector>
#include "base/macros.h"
#include "base/memory/scoped_vector.h"
#include "components/password_manager/core/browser/password_store.h"
#include "components/password_manager/core/browser/password_store_consumer.h"
#include "components/prefs/pref_member.h"
#include "ui/shell_dialogs/select_file_dialog.h"
namespace autofill {
struct PasswordForm;
}
// Multimap from sort key to password forms.
using DuplicatesMap =
std::multimap<std::string, std::unique_ptr<autofill::PasswordForm>>;
enum class PasswordEntryType { SAVED, BLACKLISTED };
class PasswordUIView;
// Contains the common logic used by a PasswordUIView to
// interact with PasswordStore. It provides completion callbacks for
// PasswordStore operations and updates the view on PasswordStore changes.
class PasswordManagerPresenter
: public password_manager::PasswordStore::Observer {
public:
// |password_view| the UI view that owns this presenter, must not be NULL.
explicit PasswordManagerPresenter(PasswordUIView* password_view);
~PasswordManagerPresenter() override;
// PasswordStore::Observer implementation.
void OnLoginsChanged(
const password_manager::PasswordStoreChangeList& changes) override;
// Repopulates the password and exception entries.
void UpdatePasswordLists();
void Initialize();
// Gets the password entry at |index|.
const autofill::PasswordForm* GetPassword(size_t index);
// Gets all password entries.
std::vector<std::unique_ptr<autofill::PasswordForm>> GetAllPasswords();
// Gets the password exception entry at |index|.
const autofill::PasswordForm* GetPasswordException(size_t index);
// Removes the saved password entry at |index|.
// |index| the entry index to be removed.
void RemoveSavedPassword(size_t index);
// Removes the saved password exception entry at |index|.
// |index| the entry index to be removed.
void RemovePasswordException(size_t index);
// Requests the plain text password for entry at |index| to be revealed.
// |index| The index of the entry.
void RequestShowPassword(size_t index);
// Returns true if the user is authenticated.
virtual bool IsUserAuthenticated();
private:
friend class PasswordManagerPresenterTest;
// Sets the password and exception list of the UI view.
void SetPasswordList();
void SetPasswordExceptionList();
// Sort entries of |list| based on sort key. The key is the concatenation of
// origin, entry type (non-Android credential, Android w/ affiliated web realm
// or Android w/o affiliated web realm). If |entry_type == SAVED|,
// username, password and federation are also included in sort key. If there
// are several forms with the same key, all such forms but the first one are
// stored in |duplicates| instead of |list|.
void SortEntriesAndHideDuplicates(
std::vector<std::unique_ptr<autofill::PasswordForm>>* list,
DuplicatesMap* duplicates,
PasswordEntryType entry_type);
// Returns the password store associated with the currently active profile.
password_manager::PasswordStore* GetPasswordStore();
// A short class to mediate requests to the password store.
class ListPopulater : public password_manager::PasswordStoreConsumer {
public:
explicit ListPopulater(PasswordManagerPresenter* page);
~ListPopulater() override;
// Send a query to the password store to populate a list.
virtual void Populate() = 0;
protected:
PasswordManagerPresenter* page_;
};
// A short class to mediate requests to the password store for passwordlist.
class PasswordListPopulater : public ListPopulater {
public:
explicit PasswordListPopulater(PasswordManagerPresenter* page);
// Send a query to the password store to populate a password list.
void Populate() override;
// Send the password store's reply back to the handler.
void OnGetPasswordStoreResults(
std::vector<std::unique_ptr<autofill::PasswordForm>> results) override;
};
// A short class to mediate requests to the password store for exceptions.
class PasswordExceptionListPopulater : public ListPopulater {
public:
explicit PasswordExceptionListPopulater(PasswordManagerPresenter* page);
// Send a query to the password store to populate a passwordException list.
void Populate() override;
// Send the password store's reply back to the handler.
void OnGetPasswordStoreResults(
std::vector<std::unique_ptr<autofill::PasswordForm>> results) override;
};
// Password store consumer for populating the password list and exceptions.
PasswordListPopulater populater_;
PasswordExceptionListPopulater exception_populater_;
std::vector<std::unique_ptr<autofill::PasswordForm>> password_list_;
std::vector<std::unique_ptr<autofill::PasswordForm>> password_exception_list_;
DuplicatesMap password_duplicates_;
DuplicatesMap password_exception_duplicates_;
// Whether to show stored passwords or not.
BooleanPrefMember show_passwords_;
// The last time the user was successfully authenticated.
// Used to determine whether or not to reveal plaintext passwords.
base::TimeTicks last_authentication_time_;
// UI view that owns this presenter.
PasswordUIView* password_view_;
DISALLOW_COPY_AND_ASSIGN(PasswordManagerPresenter);
};
#endif // CHROME_BROWSER_UI_PASSWORDS_PASSWORD_MANAGER_PRESENTER_H_
|