blob: 6a93de3bab79913169d162a0e808d25b08593eda [file] [log] [blame]
// Copyright 2014 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 COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_PASSWORD_STORE_SYNC_H_
#define COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_PASSWORD_STORE_SYNC_H_
#include <map>
#include <memory>
#include <vector>
#include "base/compiler_specific.h"
#include "base/macros.h"
#include "components/password_manager/core/browser/password_store_change.h"
#include "components/sync/model/sync_metadata_store.h"
namespace autofill {
struct PasswordForm;
}
namespace syncer {
class MetadataBatch;
}
namespace password_manager {
using PrimaryKeyToFormMap =
std::map<int, std::unique_ptr<autofill::PasswordForm>>;
// This enum is used to determine result status when deleting undecryptable
// logins from database.
enum class DatabaseCleanupResult {
kSuccess,
kItemFailure,
kDatabaseUnavailable,
kEncryptionUnavailable,
};
// PasswordStore interface for PasswordSyncableService. It provides access to
// synchronous methods of PasswordStore which shouldn't be accessible to other
// classes. These methods are to be called on the PasswordStore background
// thread only.
class PasswordStoreSync {
public:
class MetadataStore : public syncer::SyncMetadataStore {
public:
// Read all the stored metadata for passwords and fill |metadata_batch|
// with it.
virtual std::unique_ptr<syncer::MetadataBatch> GetAllSyncMetadata() = 0;
};
PasswordStoreSync();
// TODO(http://crbug.com/925307) Move the following 2 APIs to PasswordStore
// upon full migration to USS Sync architecture.
// Overwrites |forms| with all stored non-blacklisted credentials. Returns
// true on success.
virtual bool FillAutofillableLogins(
std::vector<std::unique_ptr<autofill::PasswordForm>>* forms)
WARN_UNUSED_RESULT = 0;
// Overwrites |forms| with all stored blacklisted credentials. Returns true on
// success.
virtual bool FillBlacklistLogins(
std::vector<std::unique_ptr<autofill::PasswordForm>>* forms)
WARN_UNUSED_RESULT = 0;
// Overwrites |key_to_form_map| with a map from the DB primary key to the
// corresponding form for all stored credentials. Returns true on success.
virtual bool ReadAllLogins(PrimaryKeyToFormMap* key_to_form_map)
WARN_UNUSED_RESULT = 0;
// Deletes logins that cannot be decrypted.
virtual DatabaseCleanupResult DeleteUndecryptableLogins() = 0;
// Synchronous implementation to add the given login.
virtual PasswordStoreChangeList AddLoginSync(
const autofill::PasswordForm& form) = 0;
// Synchronous implementation to update the given login.
virtual PasswordStoreChangeList UpdateLoginSync(
const autofill::PasswordForm& form) = 0;
// Synchronous implementation to remove the given login.
virtual PasswordStoreChangeList RemoveLoginSync(
const autofill::PasswordForm& form) = 0;
// Synchronous implementation to remove the login with the given primary key.
virtual PasswordStoreChangeList RemoveLoginByPrimaryKeySync(
int primary_key) = 0;
// Notifies observers that password store data may have been changed.
virtual void NotifyLoginsChanged(const PasswordStoreChangeList& changes) = 0;
// The methods below adds transaction support to the password store that's
// required by sync to guarantee atomic writes of data and sync metadata.
// TODO(crbug.com/902349): The introduction of the two functions below
// question the existence of NotifyLoginsChanged() above and all the round
// trips with PasswordStoreChangeList in the earlier functions. Instead,
// observers could be notified inside CommitTransaction().
virtual bool BeginTransaction() = 0;
virtual bool CommitTransaction() = 0;
// Returns a SyncMetadataStore that sync machinery would use to persist the
// sync metadata.
virtual MetadataStore* GetMetadataStore() = 0;
protected:
virtual ~PasswordStoreSync();
private:
DISALLOW_COPY_AND_ASSIGN(PasswordStoreSync);
};
} // namespace password_manager
#endif // COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_PASSWORD_STORE_SYNC_H_