sync_backend_host_impl.h revision e5d81f57cb97b3b6b7fccc9c5610d21eb81db09d
1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// found in the LICENSE file. 4f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#ifndef CHROME_BROWSER_SYNC_GLUE_SYNC_BACKEND_HOST_IMPL_H_ 6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#define CHROME_BROWSER_SYNC_GLUE_SYNC_BACKEND_HOST_IMPL_H_ 7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include <string> 9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/basictypes.h" 11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/callback.h" 12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/compiler_specific.h" 13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/memory/weak_ptr.h" 15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/threading/thread.h" 16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/sync/glue/extensions_activity_monitor.h" 17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/sync/glue/sync_backend_host.h" 185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/sync_driver/backend_data_type_configurer.h" 19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/public/browser/notification_observer.h" 20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/public/browser/notification_registrar.h" 21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "sync/internal_api/public/base/model_type.h" 22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "sync/internal_api/public/configure_reason.h" 23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "sync/internal_api/public/sessions/sync_session_snapshot.h" 24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "sync/internal_api/public/sync_manager.h" 25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "sync/internal_api/public/util/report_unrecoverable_error_function.h" 26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "sync/internal_api/public/util/unrecoverable_error_handler.h" 27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "sync/internal_api/public/util/weak_handle.h" 28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "sync/notifier/invalidation_handler.h" 29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "sync/protocol/encryption.pb.h" 30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "sync/protocol/sync_protocol_error.h" 31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "sync/util/extensions_activity.h" 32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class GURL; 34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class Profile; 35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace base { 37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class MessageLoop; 38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace invalidation { 41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class InvalidationService; 42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace syncer { 45a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class NetworkResources; 46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class SyncManagerFactory; 47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 4923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)namespace sync_driver { 5023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)class SyncPrefs; 5123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)} 5223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace browser_sync { 54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class ChangeProcessor; 56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class SyncBackendHostCore; 57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class SyncBackendRegistrar; 58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class SyncedDeviceTracker; 59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)struct DoInitializeOptions; 60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// The only real implementation of the SyncBackendHost. See that interface's 62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// definition for documentation of public methods. 63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class SyncBackendHostImpl 64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) : public SyncBackendHost, 65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public content::NotificationObserver, 66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public syncer::InvalidationHandler { 67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public: 68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) typedef syncer::SyncStatus Status; 69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Create a SyncBackendHost with a reference to the |frontend| that 71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // it serves and communicates to via the SyncFrontend interface (on 72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // the same thread it used to call the constructor). Must outlive 73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // |sync_prefs|. 7423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) SyncBackendHostImpl(const std::string& name, 7523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) Profile* profile, 7623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const base::WeakPtr<sync_driver::SyncPrefs>& sync_prefs); 77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual ~SyncBackendHostImpl(); 78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // SyncBackendHost implementation. 80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void Initialize( 81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SyncFrontend* frontend, 82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<base::Thread> sync_thread, 83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const syncer::WeakHandle<syncer::JsEventHandler>& event_handler, 84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const GURL& service_url, 85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const syncer::SyncCredentials& credentials, 86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool delete_sync_data_folder, 87f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<syncer::SyncManagerFactory> sync_manager_factory, 88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<syncer::UnrecoverableErrorHandler> unrecoverable_error_handler, 89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) syncer::ReportUnrecoverableErrorFunction 90a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) report_unrecoverable_error_function, 91a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) syncer::NetworkResources* network_resources) OVERRIDE; 92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void UpdateCredentials( 93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const syncer::SyncCredentials& credentials) OVERRIDE; 94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void StartSyncingWithServer() OVERRIDE; 95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void SetEncryptionPassphrase( 96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const std::string& passphrase, 97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool is_explicit) OVERRIDE; 98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual bool SetDecryptionPassphrase(const std::string& passphrase) 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OVERRIDE WARN_UNUSED_RESULT; 100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void StopSyncingForShutdown() OVERRIDE; 101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual scoped_ptr<base::Thread> Shutdown(ShutdownOption option) OVERRIDE; 102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void UnregisterInvalidationIds() OVERRIDE; 103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void ConfigureDataTypes( 104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) syncer::ConfigureReason reason, 105f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const DataTypeConfigStateMap& config_state_map, 106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const base::Callback<void(syncer::ModelTypeSet, 107f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) syncer::ModelTypeSet)>& ready_task, 108f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const base::Callback<void()>& retry_callback) OVERRIDE; 109f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void EnableEncryptEverything() OVERRIDE; 110f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void ActivateDataType( 111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) syncer::ModelType type, syncer::ModelSafeGroup group, 112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ChangeProcessor* change_processor) OVERRIDE; 113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void DeactivateDataType(syncer::ModelType type) OVERRIDE; 114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual syncer::UserShare* GetUserShare() const OVERRIDE; 115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual Status GetDetailedStatus() OVERRIDE; 116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual syncer::sessions::SyncSessionSnapshot 117f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetLastSessionSnapshot() const OVERRIDE; 118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual bool HasUnsyncedItems() const OVERRIDE; 119f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual bool IsNigoriEnabled() const OVERRIDE; 120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual syncer::PassphraseType GetPassphraseType() const OVERRIDE; 121f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual base::Time GetExplicitPassphraseTime() const OVERRIDE; 122f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual bool IsCryptographerReady( 123f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const syncer::BaseTransaction* trans) const OVERRIDE; 124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void GetModelSafeRoutingInfo( 125f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) syncer::ModelSafeRoutingInfo* out) const OVERRIDE; 126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual SyncedDeviceTracker* GetSyncedDeviceTracker() const OVERRIDE; 127e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch virtual void RequestBufferedProtocolEventsAndEnableForwarding() OVERRIDE; 128e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch virtual void DisableProtocolEventForwarding() OVERRIDE; 129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual base::MessageLoop* GetSyncLoopForTesting() OVERRIDE; 130f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) protected: 132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // The types and functions below are protected so that test 133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // subclasses can use them. 134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Allows tests to perform alternate core initialization work. 136f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void InitCore(scoped_ptr<DoInitializeOptions> options); 137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Request the syncer to reconfigure with the specfied params. 139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Virtual for testing. 140f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void RequestConfigureSyncer( 141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) syncer::ConfigureReason reason, 142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) syncer::ModelTypeSet to_download, 143f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) syncer::ModelTypeSet to_purge, 144f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) syncer::ModelTypeSet to_journal, 145f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) syncer::ModelTypeSet to_unapply, 146f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) syncer::ModelTypeSet to_ignore, 147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const syncer::ModelSafeRoutingInfo& routing_info, 148f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const base::Callback<void(syncer::ModelTypeSet, 149f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) syncer::ModelTypeSet)>& ready_task, 150f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const base::Closure& retry_callback); 151f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 152f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Called when the syncer has finished performing a configuration. 153f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void FinishConfigureDataTypesOnFrontendLoop( 154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const syncer::ModelTypeSet enabled_types, 155f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const syncer::ModelTypeSet succeeded_configuration_types, 156f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const syncer::ModelTypeSet failed_configuration_types, 157f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const base::Callback<void(syncer::ModelTypeSet, 158f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) syncer::ModelTypeSet)>& ready_task); 159f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 160f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Reports backend initialization success. Includes some objects from sync 161f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // manager initialization to be passed back to the UI thread. 162f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void HandleInitializationSuccessOnFrontendLoop( 163f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const syncer::WeakHandle<syncer::JsBackend> js_backend, 164f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const syncer::WeakHandle<syncer::DataTypeDebugInfoListener> 165f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) debug_info_listener); 166f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 167f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Downloading of control types failed and will be retried. Invokes the 168f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // frontend's sync configure retry method. 169f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void HandleControlTypesDownloadRetry(); 170f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 171effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Forwards a ProtocolEvent to the frontend. Will not be called unless a 172effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // call to SetForwardProtocolEvents() explicitly requested that we start 173effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // forwarding these events. 174effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void HandleProtocolEventOnFrontendLoop(syncer::ProtocolEvent* event); 175effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SyncFrontend* frontend() { return frontend_; } 177f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 178f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private: 179f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) friend class SyncBackendHostCore; 180f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 181f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Checks if we have received a notice to turn on experimental datatypes 182f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // (via the nigori node) and informs the frontend if that is the case. 183f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Note: it is illegal to call this before the backend is initialized. 184f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void AddExperimentalTypes(); 185f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 186f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Handles backend initialization failure. 187f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void HandleInitializationFailureOnFrontendLoop(); 188f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 189f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Called from Core::OnSyncCycleCompleted to handle updating frontend 190f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // thread components. 191f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void HandleSyncCycleCompletedOnFrontendLoop( 192f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const syncer::sessions::SyncSessionSnapshot& snapshot); 193f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 194f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Called when the syncer failed to perform a configuration and will 195f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // eventually retry. FinishingConfigurationOnFrontendLoop(..) will be called 196f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // on successful completion. 197f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void RetryConfigurationOnFrontendLoop(const base::Closure& retry_callback); 198f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 199f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Helpers to persist a token that can be used to bootstrap sync encryption 200f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // across browser restart to avoid requiring the user to re-enter their 201f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // passphrase. |token| must be valid UTF-8 as we use the PrefService for 202f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // storage. 203f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void PersistEncryptionBootstrapToken( 204f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const std::string& token, 205f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) syncer::BootstrapTokenType token_type); 206f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 207f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // For convenience, checks if initialization state is INITIALIZED. 208f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool initialized() const { return initialized_; } 209f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 210f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Let the front end handle the actionable error event. 211f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void HandleActionableErrorEventOnFrontendLoop( 212f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const syncer::SyncProtocolError& sync_error); 213f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Handle a migration request. 2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void HandleMigrationRequestedOnFrontendLoop(const syncer::ModelTypeSet types); 2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 217f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Checks if |passphrase| can be used to decrypt the cryptographer's pending 218f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // keys that were cached during NotifyPassphraseRequired. Returns true if 219f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // decryption was successful. Returns false otherwise. Must be called with a 220f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // non-empty pending keys cache. 221f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool CheckPassphraseAgainstCachedPendingKeys( 222f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const std::string& passphrase) const; 223f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 224f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Invoked when a passphrase is required to decrypt a set of Nigori keys, 225f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // or for encrypting. |reason| denotes why the passphrase was required. 226f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // |pending_keys| is a copy of the cryptographer's pending keys, that are 227f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // cached by the frontend. If there are no pending keys, or if the passphrase 228f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // required reason is REASON_ENCRYPTION, an empty EncryptedData object is 229f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // passed. 230f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void NotifyPassphraseRequired(syncer::PassphraseRequiredReason reason, 231f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) sync_pb::EncryptedData pending_keys); 232f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 233f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Invoked when the passphrase provided by the user has been accepted. 234f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void NotifyPassphraseAccepted(); 235f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 236f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Invoked when the set of encrypted types or the encrypt 237f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // everything flag changes. 238f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void NotifyEncryptedTypesChanged( 239f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) syncer::ModelTypeSet encrypted_types, 240f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool encrypt_everything); 241f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 242f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Invoked when sync finishes encrypting new datatypes. 243f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void NotifyEncryptionComplete(); 244f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 245f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Invoked when the passphrase state has changed. Caches the passphrase state 246f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // for later use on the UI thread. 247f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // If |type| is FROZEN_IMPLICIT_PASSPHRASE or CUSTOM_PASSPHRASE, 248f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // |explicit_passphrase_time| is the time at which that passphrase was set 249f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // (if available). 250f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void HandlePassphraseTypeChangedOnFrontendLoop( 251f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) syncer::PassphraseType type, 252f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::Time explicit_passphrase_time); 253f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 254f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void HandleStopSyncingPermanentlyOnFrontendLoop(); 255f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 256f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Dispatched to from OnConnectionStatusChange to handle updating 257f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // frontend UI components. 258f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void HandleConnectionStatusChangeOnFrontendLoop( 259f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) syncer::ConnectionStatus status); 260f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 261f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // NotificationObserver implementation. 262f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void Observe( 263f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int type, 264f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const content::NotificationSource& source, 265f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const content::NotificationDetails& details) OVERRIDE; 266f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 267f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // InvalidationHandler implementation. 268f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void OnInvalidatorStateChange( 269f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) syncer::InvalidatorState state) OVERRIDE; 270f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void OnIncomingInvalidation( 271f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const syncer::ObjectIdInvalidationMap& invalidation_map) OVERRIDE; 272a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual std::string GetOwnerName() const OVERRIDE; 273f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 274f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::NotificationRegistrar notification_registrar_; 275f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 276f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // A reference to the MessageLoop used to construct |this|, so we know how 277f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // to safely talk back to the SyncFrontend. 278f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::MessageLoop* const frontend_loop_; 279f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 280f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Profile* const profile_; 281f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 282f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Name used for debugging (set from profile_->GetDebugName()). 283f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const std::string name_; 284f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 285f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Our core, which communicates directly to the syncapi. Use refptr instead 286f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // of WeakHandle because |core_| is created on UI loop but released on 287f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // sync loop. 288f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_refptr<SyncBackendHostCore> core_; 289f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 290f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool initialized_; 291f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 29223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const base::WeakPtr<sync_driver::SyncPrefs> sync_prefs_; 293f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 294f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ExtensionsActivityMonitor extensions_activity_monitor_; 295f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 296f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<SyncBackendRegistrar> registrar_; 297f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 298f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // The frontend which we serve (and are owned by). 299f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SyncFrontend* frontend_; 300f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 301f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // We cache the cryptographer's pending keys whenever NotifyPassphraseRequired 302f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // is called. This way, before the UI calls SetDecryptionPassphrase on the 303f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // syncer, it can avoid the overhead of an asynchronous decryption call and 304f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // give the user immediate feedback about the passphrase entered by first 305f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // trying to decrypt the cached pending keys on the UI thread. Note that 306f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // SetDecryptionPassphrase can still fail after the cached pending keys are 307f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // successfully decrypted if the pending keys have changed since the time they 308f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // were cached. 309f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) sync_pb::EncryptedData cached_pending_keys_; 310f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 311f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // The state of the passphrase required to decrypt the bag of encryption keys 312f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // in the nigori node. Updated whenever a new nigori node arrives or the user 313f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // manually changes their passphrase state. Cached so we can synchronously 314f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // check it from the UI thread. 315f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) syncer::PassphraseType cached_passphrase_type_; 316f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 317f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // If an explicit passphrase is in use, the time at which the passphrase was 318f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // first set (if available). 319f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::Time cached_explicit_passphrase_time_; 320f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 321f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // UI-thread cache of the last SyncSessionSnapshot received from syncapi. 322f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) syncer::sessions::SyncSessionSnapshot last_snapshot_; 323f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 324f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) invalidation::InvalidationService* invalidator_; 325f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool invalidation_handler_registered_; 326f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 327f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::WeakPtrFactory<SyncBackendHostImpl> weak_ptr_factory_; 328f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 329f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(SyncBackendHostImpl); 330f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}; 331f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 332f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} // namespace browser_sync 333f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 334f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif // CHROME_BROWSER_SYNC_GLUE_SYNC_BACKEND_HOST_IMPL_H_ 335f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 336