| Index: chrome/browser/password_manager/native_backend_kwallet_x.cc
|
| diff --git a/chrome/browser/password_manager/native_backend_kwallet_x.cc b/chrome/browser/password_manager/native_backend_kwallet_x.cc
|
| index 21c63693a9641109edab2027a58cb996274e066f..48e19539ceea61c21e7d0199d92984a77e081159 100644
|
| --- a/chrome/browser/password_manager/native_backend_kwallet_x.cc
|
| +++ b/chrome/browser/password_manager/native_backend_kwallet_x.cc
|
| @@ -7,12 +7,14 @@
|
| #include <stddef.h>
|
| #include <stdint.h>
|
|
|
| +#include <iterator>
|
| #include <map>
|
| #include <utility>
|
| #include <vector>
|
|
|
| #include "base/bind.h"
|
| #include "base/logging.h"
|
| +#include "base/memory/ptr_util.h"
|
| #include "base/metrics/histogram_macros.h"
|
| #include "base/pickle.h"
|
| #include "base/stl_util.h"
|
| @@ -114,7 +116,7 @@ bool DeserializeValueSize(const std::string& signon_realm,
|
| int version,
|
| bool size_32,
|
| bool warn_only,
|
| - ScopedVector<autofill::PasswordForm>* forms) {
|
| + std::vector<std::unique_ptr<PasswordForm>>* forms) {
|
| base::PickleIterator iter = init_iter;
|
|
|
| size_t count = 0;
|
| @@ -152,7 +154,7 @@ bool DeserializeValueSize(const std::string& signon_realm,
|
|
|
| // We'll swap |converted_forms| with |*forms| on success, to make sure we
|
| // don't return partial results on failure.
|
| - ScopedVector<autofill::PasswordForm> converted_forms;
|
| + std::vector<std::unique_ptr<PasswordForm>> converted_forms;
|
| converted_forms.reserve(count);
|
| for (size_t i = 0; i < count; ++i) {
|
| std::unique_ptr<PasswordForm> form(new PasswordForm());
|
| @@ -249,11 +251,11 @@ bool DeserializeValueSize(const std::string& signon_realm,
|
| }
|
|
|
| // Serializes a list of PasswordForms to be stored in the wallet.
|
| -void SerializeValue(const std::vector<autofill::PasswordForm*>& forms,
|
| +void SerializeValue(const std::vector<std::unique_ptr<PasswordForm>>& forms,
|
| base::Pickle* pickle) {
|
| pickle->WriteInt(kPickleVersion);
|
| pickle->WriteUInt64(forms.size());
|
| - for (autofill::PasswordForm* form : forms) {
|
| + for (const auto& form : forms) {
|
| pickle->WriteInt(form->scheme);
|
| pickle->WriteString(form->origin.spec());
|
| pickle->WriteString(form->action.spec());
|
| @@ -281,14 +283,6 @@ void SerializeValue(const std::vector<autofill::PasswordForm*>& forms,
|
| }
|
| }
|
|
|
| -// Moves the content of |second| to the end of |first|.
|
| -void AppendSecondToFirst(ScopedVector<autofill::PasswordForm>* first,
|
| - ScopedVector<autofill::PasswordForm> second) {
|
| - first->reserve(first->size() + second.size());
|
| - first->insert(first->end(), second.begin(), second.end());
|
| - second.weak_clear();
|
| -}
|
| -
|
| void UMALogDeserializationStatus(bool success) {
|
| UMA_HISTOGRAM_BOOLEAN("PasswordManager.KWalletDeserializationStatus",
|
| success);
|
| @@ -406,14 +400,15 @@ password_manager::PasswordStoreChangeList NativeBackendKWallet::AddLogin(
|
| if (wallet_handle == kInvalidKWalletHandle)
|
| return password_manager::PasswordStoreChangeList();
|
|
|
| - ScopedVector<autofill::PasswordForm> forms;
|
| + std::vector<std::unique_ptr<PasswordForm>> forms;
|
| if (!GetLoginsList(form.signon_realm, wallet_handle, &forms))
|
| return password_manager::PasswordStoreChangeList();
|
|
|
| - auto it = std::partition(forms.begin(), forms.end(),
|
| - [&form](const PasswordForm* current_form) {
|
| - return !ArePasswordFormUniqueKeyEqual(form, *current_form);
|
| - });
|
| + auto it = std::partition(
|
| + forms.begin(), forms.end(),
|
| + [&form](const std::unique_ptr<PasswordForm>& current_form) {
|
| + return !ArePasswordFormUniqueKeyEqual(form, *current_form);
|
| + });
|
| password_manager::PasswordStoreChangeList changes;
|
| if (it != forms.end()) {
|
| // It's an update.
|
| @@ -422,11 +417,11 @@ password_manager::PasswordStoreChangeList NativeBackendKWallet::AddLogin(
|
| forms.erase(it, forms.end());
|
| }
|
|
|
| - forms.push_back(new PasswordForm(form));
|
| + forms.push_back(base::MakeUnique<PasswordForm>(form));
|
| changes.push_back(password_manager::PasswordStoreChange(
|
| password_manager::PasswordStoreChange::ADD, form));
|
|
|
| - bool ok = SetLoginsList(forms.get(), form.signon_realm, wallet_handle);
|
| + bool ok = SetLoginsList(forms, form.signon_realm, wallet_handle);
|
| if (!ok)
|
| changes.clear();
|
|
|
| @@ -441,21 +436,22 @@ bool NativeBackendKWallet::UpdateLogin(
|
| if (wallet_handle == kInvalidKWalletHandle)
|
| return false;
|
|
|
| - ScopedVector<autofill::PasswordForm> forms;
|
| + std::vector<std::unique_ptr<PasswordForm>> forms;
|
| if (!GetLoginsList(form.signon_realm, wallet_handle, &forms))
|
| return false;
|
|
|
| - auto it = std::partition(forms.begin(), forms.end(),
|
| - [&form](const PasswordForm* current_form) {
|
| - return !ArePasswordFormUniqueKeyEqual(form, *current_form);
|
| - });
|
| + auto it = std::partition(
|
| + forms.begin(), forms.end(),
|
| + [&form](const std::unique_ptr<PasswordForm>& current_form) {
|
| + return !ArePasswordFormUniqueKeyEqual(form, *current_form);
|
| + });
|
|
|
| if (it == forms.end())
|
| return true;
|
|
|
| forms.erase(it, forms.end());
|
| - forms.push_back(new PasswordForm(form));
|
| - if (SetLoginsList(forms.get(), form.signon_realm, wallet_handle)) {
|
| + forms.push_back(base::MakeUnique<PasswordForm>(form));
|
| + if (SetLoginsList(forms, form.signon_realm, wallet_handle)) {
|
| changes->push_back(password_manager::PasswordStoreChange(
|
| password_manager::PasswordStoreChange::UPDATE, form));
|
| return true;
|
| @@ -472,23 +468,22 @@ bool NativeBackendKWallet::RemoveLogin(
|
| if (wallet_handle == kInvalidKWalletHandle)
|
| return false;
|
|
|
| - ScopedVector<autofill::PasswordForm> all_forms;
|
| + std::vector<std::unique_ptr<PasswordForm>> all_forms;
|
| if (!GetLoginsList(form.signon_realm, wallet_handle, &all_forms))
|
| return false;
|
|
|
| - ScopedVector<autofill::PasswordForm> kept_forms;
|
| + std::vector<std::unique_ptr<PasswordForm>> kept_forms;
|
| kept_forms.reserve(all_forms.size());
|
| - for (auto*& saved_form : all_forms) {
|
| + for (std::unique_ptr<PasswordForm>& saved_form : all_forms) {
|
| if (!ArePasswordFormUniqueKeyEqual(form, *saved_form)) {
|
| - kept_forms.push_back(saved_form);
|
| - saved_form = nullptr;
|
| + kept_forms.push_back(std::move(saved_form));
|
| }
|
| }
|
|
|
| if (kept_forms.size() != all_forms.size()) {
|
| changes->push_back(password_manager::PasswordStoreChange(
|
| password_manager::PasswordStoreChange::REMOVE, form));
|
| - return SetLoginsList(kept_forms.get(), form.signon_realm, wallet_handle);
|
| + return SetLoginsList(kept_forms, form.signon_realm, wallet_handle);
|
| }
|
|
|
| return true;
|
| @@ -512,11 +507,11 @@ bool NativeBackendKWallet::RemoveLoginsSyncedBetween(
|
| bool NativeBackendKWallet::DisableAutoSignInForOrigins(
|
| const base::Callback<bool(const GURL&)>& origin_filter,
|
| password_manager::PasswordStoreChangeList* changes) {
|
| - ScopedVector<autofill::PasswordForm> all_forms;
|
| + std::vector<std::unique_ptr<PasswordForm>> all_forms;
|
| if (!GetAllLogins(&all_forms))
|
| return false;
|
|
|
| - for (auto* form : all_forms) {
|
| + for (const std::unique_ptr<PasswordForm>& form : all_forms) {
|
| if (origin_filter.Run(form->origin) && !form->skip_zero_click) {
|
| form->skip_zero_click = true;
|
| if (!UpdateLogin(*form, changes))
|
| @@ -528,7 +523,7 @@ bool NativeBackendKWallet::DisableAutoSignInForOrigins(
|
|
|
| bool NativeBackendKWallet::GetLogins(
|
| const password_manager::PasswordStore::FormDigest& form,
|
| - ScopedVector<autofill::PasswordForm>* forms) {
|
| + std::vector<std::unique_ptr<PasswordForm>>* forms) {
|
| int wallet_handle = WalletHandle();
|
| if (wallet_handle == kInvalidKWalletHandle)
|
| return false;
|
| @@ -536,7 +531,7 @@ bool NativeBackendKWallet::GetLogins(
|
| }
|
|
|
| bool NativeBackendKWallet::GetAutofillableLogins(
|
| - ScopedVector<autofill::PasswordForm>* forms) {
|
| + std::vector<std::unique_ptr<PasswordForm>>* forms) {
|
| int wallet_handle = WalletHandle();
|
| if (wallet_handle == kInvalidKWalletHandle)
|
| return false;
|
| @@ -544,7 +539,7 @@ bool NativeBackendKWallet::GetAutofillableLogins(
|
| }
|
|
|
| bool NativeBackendKWallet::GetBlacklistLogins(
|
| - ScopedVector<autofill::PasswordForm>* forms) {
|
| + std::vector<std::unique_ptr<PasswordForm>>* forms) {
|
| int wallet_handle = WalletHandle();
|
| if (wallet_handle == kInvalidKWalletHandle)
|
| return false;
|
| @@ -552,7 +547,7 @@ bool NativeBackendKWallet::GetBlacklistLogins(
|
| }
|
|
|
| bool NativeBackendKWallet::GetAllLogins(
|
| - ScopedVector<autofill::PasswordForm>* forms) {
|
| + std::vector<std::unique_ptr<PasswordForm>>* forms) {
|
| int wallet_handle = WalletHandle();
|
| if (wallet_handle == kInvalidKWalletHandle)
|
| return false;
|
| @@ -562,7 +557,7 @@ bool NativeBackendKWallet::GetAllLogins(
|
| bool NativeBackendKWallet::GetLoginsList(
|
| const std::string& signon_realm,
|
| int wallet_handle,
|
| - ScopedVector<autofill::PasswordForm>* forms) {
|
| + std::vector<std::unique_ptr<PasswordForm>>* forms) {
|
| forms->clear();
|
| // Is there an entry in the wallet?
|
| bool has_entry = false;
|
| @@ -598,43 +593,45 @@ bool NativeBackendKWallet::GetLoginsList(
|
| bool NativeBackendKWallet::GetLoginsList(
|
| BlacklistOptions options,
|
| int wallet_handle,
|
| - ScopedVector<autofill::PasswordForm>* forms) {
|
| + std::vector<std::unique_ptr<PasswordForm>>* forms) {
|
| forms->clear();
|
| - ScopedVector<autofill::PasswordForm> all_forms;
|
| + std::vector<std::unique_ptr<PasswordForm>> all_forms;
|
| if (!GetAllLoginsInternal(wallet_handle, &all_forms))
|
| return false;
|
|
|
| // Remove the duplicate sync tags.
|
| - ScopedVector<autofill::PasswordForm> duplicates;
|
| + std::vector<std::unique_ptr<PasswordForm>> duplicates;
|
| password_manager_util::FindDuplicates(&all_forms, &duplicates, nullptr);
|
| if (!duplicates.empty()) {
|
| // Fill the signon realms to be updated.
|
| - std::map<std::string, std::vector<autofill::PasswordForm*>> update_forms;
|
| - for (autofill::PasswordForm* form : duplicates) {
|
| + std::map<std::string, std::vector<std::unique_ptr<PasswordForm>>>
|
| + update_forms;
|
| + for (const auto& form : duplicates) {
|
| update_forms.insert(std::make_pair(
|
| - form->signon_realm, std::vector<autofill::PasswordForm*>()));
|
| + form->signon_realm, std::vector<std::unique_ptr<PasswordForm>>()));
|
| }
|
|
|
| // Fill the actual forms to be saved.
|
| - for (autofill::PasswordForm* form : all_forms) {
|
| + for (const auto& form : all_forms) {
|
| auto it = update_forms.find(form->signon_realm);
|
| if (it != update_forms.end())
|
| - it->second.push_back(form);
|
| + it->second.push_back(base::MakeUnique<PasswordForm>(*form));
|
| }
|
|
|
| // Update the backend.
|
| - for (const auto& forms : update_forms) {
|
| - if (!SetLoginsList(forms.second, forms.first, wallet_handle))
|
| + for (const auto& update_forms_for_realm : update_forms) {
|
| + if (!SetLoginsList(update_forms_for_realm.second,
|
| + update_forms_for_realm.first, wallet_handle)) {
|
| return false;
|
| + }
|
| }
|
| }
|
| // We have to read all the entries, and then filter them here.
|
| forms->reserve(all_forms.size());
|
| - for (auto*& saved_form : all_forms) {
|
| + for (std::unique_ptr<PasswordForm>& saved_form : all_forms) {
|
| if (saved_form->blacklisted_by_user ==
|
| (options == BlacklistOptions::BLACKLISTED)) {
|
| - forms->push_back(saved_form);
|
| - saved_form = nullptr;
|
| + forms->push_back(std::move(saved_form));
|
| }
|
| }
|
|
|
| @@ -643,7 +640,7 @@ bool NativeBackendKWallet::GetLoginsList(
|
|
|
| bool NativeBackendKWallet::GetAllLoginsInternal(
|
| int wallet_handle,
|
| - ScopedVector<autofill::PasswordForm>* forms) {
|
| + std::vector<std::unique_ptr<PasswordForm>>* forms) {
|
| // We could probably also use readEntryList here.
|
| std::vector<std::string> realm_list;
|
| KWalletDBus::Error error = kwallet_dbus_.EntryList(
|
| @@ -665,13 +662,17 @@ bool NativeBackendKWallet::GetAllLoginsInternal(
|
| // Can't we all just agree on whether bytes are signed or not? Please?
|
| base::Pickle pickle(reinterpret_cast<const char*>(bytes.data()),
|
| bytes.size());
|
| - AppendSecondToFirst(forms, DeserializeValue(signon_realm, pickle));
|
| + std::vector<std::unique_ptr<PasswordForm>> from_pickle =
|
| + DeserializeValue(signon_realm, pickle);
|
| + forms->reserve(forms->size() + from_pickle.size());
|
| + std::move(from_pickle.begin(), from_pickle.end(),
|
| + std::back_inserter(*forms));
|
| }
|
| return true;
|
| }
|
|
|
| bool NativeBackendKWallet::SetLoginsList(
|
| - const std::vector<autofill::PasswordForm*>& forms,
|
| + const std::vector<std::unique_ptr<PasswordForm>>& forms,
|
| const std::string& signon_realm,
|
| int wallet_handle) {
|
| if (forms.empty()) {
|
| @@ -733,27 +734,26 @@ bool NativeBackendKWallet::RemoveLoginsBetween(
|
| // Can't we all just agree on whether bytes are signed or not? Please?
|
| base::Pickle pickle(reinterpret_cast<const char*>(bytes.data()),
|
| bytes.size());
|
| - ScopedVector<autofill::PasswordForm> all_forms =
|
| + std::vector<std::unique_ptr<PasswordForm>> all_forms =
|
| DeserializeValue(signon_realm, pickle);
|
|
|
| - ScopedVector<autofill::PasswordForm> kept_forms;
|
| + std::vector<std::unique_ptr<PasswordForm>> kept_forms;
|
| kept_forms.reserve(all_forms.size());
|
| - base::Time autofill::PasswordForm::*date_member =
|
| - date_to_compare == CREATION_TIMESTAMP
|
| - ? &autofill::PasswordForm::date_created
|
| - : &autofill::PasswordForm::date_synced;
|
| - for (auto*& saved_form : all_forms) {
|
| - if (delete_begin <= saved_form->*date_member &&
|
| - (delete_end.is_null() || saved_form->*date_member < delete_end)) {
|
| + base::Time PasswordForm::*date_member =
|
| + date_to_compare == CREATION_TIMESTAMP ? &PasswordForm::date_created
|
| + : &PasswordForm::date_synced;
|
| + for (std::unique_ptr<PasswordForm>& saved_form : all_forms) {
|
| + if (delete_begin <= saved_form.get()->*date_member &&
|
| + (delete_end.is_null() ||
|
| + saved_form.get()->*date_member < delete_end)) {
|
| changes->push_back(password_manager::PasswordStoreChange(
|
| password_manager::PasswordStoreChange::REMOVE, *saved_form));
|
| } else {
|
| - kept_forms.push_back(saved_form);
|
| - saved_form = nullptr;
|
| + kept_forms.push_back(std::move(saved_form));
|
| }
|
| }
|
|
|
| - if (!SetLoginsList(kept_forms.get(), signon_realm, wallet_handle)) {
|
| + if (!SetLoginsList(kept_forms, signon_realm, wallet_handle)) {
|
| ok = false;
|
| changes->clear();
|
| }
|
| @@ -762,9 +762,9 @@ bool NativeBackendKWallet::RemoveLoginsBetween(
|
| }
|
|
|
| // static
|
| -ScopedVector<autofill::PasswordForm> NativeBackendKWallet::DeserializeValue(
|
| - const std::string& signon_realm,
|
| - const base::Pickle& pickle) {
|
| +std::vector<std::unique_ptr<PasswordForm>>
|
| +NativeBackendKWallet::DeserializeValue(const std::string& signon_realm,
|
| + const base::Pickle& pickle) {
|
| base::PickleIterator iter(pickle);
|
|
|
| int version = -1;
|
| @@ -772,10 +772,10 @@ ScopedVector<autofill::PasswordForm> NativeBackendKWallet::DeserializeValue(
|
| version < 0 || version > kPickleVersion) {
|
| LOG(ERROR) << "Failed to deserialize KWallet entry "
|
| << "(realm: " << signon_realm << ")";
|
| - return ScopedVector<autofill::PasswordForm>();
|
| + return std::vector<std::unique_ptr<PasswordForm>>();
|
| }
|
|
|
| - ScopedVector<autofill::PasswordForm> forms;
|
| + std::vector<std::unique_ptr<PasswordForm>> forms;
|
| bool success = true;
|
| if (version > 0) {
|
| // In current pickles, we expect 64-bit sizes. Failure is an error.
|
|
|