123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478 |
- // Copyright (c) 2012 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_SYNC_DRIVER_SYNC_SERVICE_IMPL_H_
- #define COMPONENTS_SYNC_DRIVER_SYNC_SERVICE_IMPL_H_
- #include <memory>
- #include <set>
- #include <string>
- #include <vector>
- #include "base/location.h"
- #include "base/memory/raw_ptr.h"
- #include "base/memory/scoped_refptr.h"
- #include "base/memory/weak_ptr.h"
- #include "base/observer_list.h"
- #include "base/sequence_checker.h"
- #include "base/task/sequenced_task_runner.h"
- #include "base/threading/thread.h"
- #include "base/time/time.h"
- #include "build/build_config.h"
- #include "components/policy/core/common/policy_service.h"
- #include "components/signin/public/identity_manager/identity_manager.h"
- #include "components/sync/base/model_type.h"
- #include "components/sync/base/sync_prefs.h"
- #include "components/sync/driver/data_type_controller.h"
- #include "components/sync/driver/data_type_manager.h"
- #include "components/sync/driver/data_type_manager_observer.h"
- #include "components/sync/driver/data_type_status_table.h"
- #include "components/sync/driver/startup_controller.h"
- #include "components/sync/driver/sync_client.h"
- #include "components/sync/driver/sync_service.h"
- #include "components/sync/driver/sync_service_crypto.h"
- #include "components/sync/driver/sync_stopped_reporter.h"
- #include "components/sync/driver/sync_user_settings_impl.h"
- #include "components/sync/engine/configure_reason.h"
- #include "components/sync/engine/events/protocol_event_observer.h"
- #include "components/sync/engine/net/http_post_provider_factory.h"
- #include "components/sync/engine/shutdown_reason.h"
- #include "components/sync/engine/sync_engine.h"
- #include "components/sync/engine/sync_engine_host.h"
- #include "components/version_info/channel.h"
- #include "google_apis/gaia/gaia_auth_util.h"
- #include "google_apis/gaia/google_service_auth_error.h"
- #include "url/gurl.h"
- namespace network {
- class NetworkConnectionTracker;
- class SharedURLLoaderFactory;
- } // namespace network
- namespace syncer {
- class BackendMigrator;
- class SyncAuthManager;
- // Look at the SyncService interface for information on how to use this class.
- // You should not need to know about SyncServiceImpl directly.
- class SyncServiceImpl : public SyncService,
- public SyncEngineHost,
- public SyncPrefObserver,
- public DataTypeManagerObserver,
- public SyncServiceCrypto::Delegate,
- public signin::IdentityManager::Observer {
- public:
- // If AUTO_START, sync will set IsFirstSetupComplete() automatically and sync
- // will begin syncing without the user needing to confirm sync settings.
- enum StartBehavior {
- AUTO_START,
- MANUAL_START,
- };
- // Bundles the arguments for SyncServiceImpl construction. This is a
- // movable struct. Because of the non-POD data members, it needs out-of-line
- // constructors, so in particular the move constructor needs to be
- // explicitly defined.
- struct InitParams {
- InitParams();
- InitParams(const InitParams&) = delete;
- InitParams& operator=(const InitParams&) = delete;
- InitParams(InitParams&& other);
- ~InitParams();
- std::unique_ptr<SyncClient> sync_client;
- // TODO(treib): Remove this and instead retrieve it via
- // SyncClient::GetIdentityManager (but mind LocalSync).
- raw_ptr<signin::IdentityManager> identity_manager = nullptr;
- StartBehavior start_behavior = MANUAL_START;
- scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory;
- raw_ptr<network::NetworkConnectionTracker> network_connection_tracker =
- nullptr;
- version_info::Channel channel = version_info::Channel::UNKNOWN;
- std::string debug_identifier;
- raw_ptr<policy::PolicyService> policy_service = nullptr;
- };
- explicit SyncServiceImpl(InitParams init_params);
- SyncServiceImpl(const SyncServiceImpl&) = delete;
- SyncServiceImpl& operator=(const SyncServiceImpl&) = delete;
- ~SyncServiceImpl() override;
- // Initializes the object. This must be called at most once, and
- // immediately after an object of this class is constructed.
- void Initialize();
- // SyncService implementation
- SyncUserSettings* GetUserSettings() override;
- const SyncUserSettings* GetUserSettings() const override;
- DisableReasonSet GetDisableReasons() const override;
- TransportState GetTransportState() const override;
- bool IsLocalSyncEnabled() const override;
- CoreAccountInfo GetAccountInfo() const override;
- bool HasSyncConsent() const override;
- GoogleServiceAuthError GetAuthError() const override;
- base::Time GetAuthErrorTime() const override;
- bool RequiresClientUpgrade() const override;
- std::unique_ptr<SyncSetupInProgressHandle> GetSetupInProgressHandle()
- override;
- bool IsSetupInProgress() const override;
- ModelTypeSet GetPreferredDataTypes() const override;
- ModelTypeSet GetActiveDataTypes() const override;
- void StopAndClear() override;
- void OnDataTypeRequestsSyncStartup(ModelType type) override;
- void TriggerRefresh(const ModelTypeSet& types) override;
- void DataTypePreconditionChanged(ModelType type) override;
- void SetInvalidationsForSessionsEnabled(bool enabled) override;
- void AddTrustedVaultDecryptionKeysFromWeb(
- const std::string& gaia_id,
- const std::vector<std::vector<uint8_t>>& keys,
- int last_key_version) override;
- void AddTrustedVaultRecoveryMethodFromWeb(
- const std::string& gaia_id,
- const std::vector<uint8_t>& public_key,
- int method_type_hint,
- base::OnceClosure callback) override;
- void AddObserver(SyncServiceObserver* observer) override;
- void RemoveObserver(SyncServiceObserver* observer) override;
- bool HasObserver(const SyncServiceObserver* observer) const override;
- SyncTokenStatus GetSyncTokenStatusForDebugging() const override;
- bool QueryDetailedSyncStatusForDebugging(SyncStatus* result) const override;
- base::Time GetLastSyncedTimeForDebugging() const override;
- SyncCycleSnapshot GetLastCycleSnapshotForDebugging() const override;
- std::unique_ptr<base::Value> GetTypeStatusMapForDebugging() const override;
- void GetEntityCountsForDebugging(
- base::OnceCallback<void(const std::vector<TypeEntitiesCount>&)> callback)
- const override;
- const GURL& GetSyncServiceUrlForDebugging() const override;
- std::string GetUnrecoverableErrorMessageForDebugging() const override;
- base::Location GetUnrecoverableErrorLocationForDebugging() const override;
- void AddProtocolEventObserver(ProtocolEventObserver* observer) override;
- void RemoveProtocolEventObserver(ProtocolEventObserver* observer) override;
- void GetAllNodesForDebugging(
- base::OnceCallback<void(base::Value::List)> callback) override;
- // SyncEngineHost implementation.
- void OnEngineInitialized(bool success,
- bool is_first_time_sync_configure) override;
- void OnSyncCycleCompleted(const SyncCycleSnapshot& snapshot) override;
- void OnProtocolEvent(const ProtocolEvent& event) override;
- void OnConnectionStatusChange(ConnectionStatus status) override;
- void OnMigrationNeededForTypes(ModelTypeSet types) override;
- void OnActionableError(const SyncProtocolError& error) override;
- void OnBackedOffTypesChanged() override;
- // DataTypeManagerObserver implementation.
- void OnConfigureDone(const DataTypeManager::ConfigureResult& result) override;
- void OnConfigureStart() override;
- // SyncServiceCrypto::Delegate implementation.
- void CryptoStateChanged() override;
- void CryptoRequiredUserActionChanged() override;
- void ReconfigureDataTypesDueToCrypto() override;
- void SetEncryptionBootstrapToken(const std::string& bootstrap_token) override;
- std::string GetEncryptionBootstrapToken() override;
- // IdentityManager::Observer implementation.
- void OnAccountsInCookieUpdated(
- const signin::AccountsInCookieJarInfo& accounts_in_cookie_jar_info,
- const GoogleServiceAuthError& error) override;
- void OnErrorStateOfRefreshTokenUpdatedForAccount(
- const CoreAccountInfo& account_info,
- const GoogleServiceAuthError& error) override;
- // Similar to above but with a callback that will be invoked on completion.
- void OnAccountsInCookieUpdatedWithCallback(
- const std::vector<gaia::ListedAccount>& signed_in_accounts,
- base::OnceClosure callback);
- // Returns true if currently signed in account is not present in the list of
- // accounts from cookie jar.
- bool HasCookieJarMismatch(
- const std::vector<gaia::ListedAccount>& cookie_jar_accounts);
- // SyncPrefObserver implementation.
- void OnSyncManagedPrefChange(bool is_sync_managed) override;
- void OnFirstSetupCompletePrefChange(bool is_first_setup_complete) override;
- void OnSyncRequestedPrefChange(bool is_sync_requested) override;
- void OnPreferredDataTypesPrefChange() override;
- // KeyedService implementation. This must be called exactly
- // once (before this object is destroyed).
- void Shutdown() override;
- // Returns whether or not the underlying sync engine has made any
- // local changes to items that have not yet been synced with the
- // server.
- void HasUnsyncedItemsForTest(base::OnceCallback<void(bool)> cb) const;
- // Used by MigrationWatcher. May return null.
- BackendMigrator* GetBackendMigratorForTest();
- // Used by tests to inspect interaction with the access token fetcher.
- bool IsRetryingAccessTokenFetchForTest() const;
- // Used by tests to inspect the OAuth2 access tokens used by PSS.
- std::string GetAccessTokenForTest() const;
- // Overrides the callback used to create network connections.
- // TODO(crbug.com/949504): Inject this in the ctor instead. As it is, it's
- // possible that the real callback was already used before the test had a
- // chance to call this.
- void OverrideNetworkForTest(const CreateHttpPostProviderFactory&
- create_http_post_provider_factory_cb);
- ModelTypeSet GetRegisteredDataTypesForTest() const;
- bool HasAnyDatatypeErrorForTest() const;
- void GetThrottledDataTypesForTest(
- base::OnceCallback<void(ModelTypeSet)> cb) const;
- // Simulates that all policies just got loaded. This does nothing if the
- // policies were already loaded.
- void TriggerPoliciesLoadedForTest();
- bool IsDataTypeControllerRunningForTest(ModelType type) const;
- // Some tests rely on injecting calls to the encryption observer.
- SyncEncryptionHandler::Observer* GetEncryptionObserverForTest();
- SyncClient* GetSyncClientForTest();
- private:
- enum UnrecoverableErrorReason {
- ERROR_REASON_ENGINE_INIT_FAILURE,
- ERROR_REASON_ACTIONABLE_ERROR,
- };
- // These values are persisted to logs. Entries should not be renumbered and
- // numeric values should never be reused.
- enum class ResetEngineReason {
- kShutdown = 0,
- kUnrecoverableError = 1,
- kDisabledAccount = 2,
- kRequestedPrefChange = 3,
- kStopAndClear = 4,
- // kSetSyncAllowedByPlatform = 5,
- kCredentialsChanged = 6,
- kResetLocalData = 7,
- kMaxValue = kResetLocalData
- };
- // Callbacks for SyncAuthManager.
- void AccountStateChanged();
- void CredentialsChanged();
- // A wrapper around SyncUserSettings::SetSyncRequested(), such that the
- // notification which is synchronously triggered will be ignored in the
- // implementation of OnSyncRequestedPrefChange().
- void SetSyncRequestedAndIgnoreNotification(bool is_requested);
- bool IsEngineAllowedToRun() const;
- // Reconfigures the data type manager with the latest enabled types.
- // Note: Does not initialize the engine if it is not already initialized.
- // If a Sync setup is currently in progress (i.e. a settings UI is open), then
- // the reconfiguration will only happen if |bypass_setup_in_progress_check| is
- // set to true.
- void ReconfigureDatatypeManager(bool bypass_setup_in_progress_check);
- // Helper to install and configure a data type manager.
- void ConfigureDataTypeManager(ConfigureReason reason);
- bool UseTransportOnlyMode() const;
- // Returns the set of data types that are supported in principle, possibly
- // influenced by command-line options.
- ModelTypeSet GetRegisteredDataTypes() const;
- // Returns the ModelTypes allowed in transport-only mode (i.e. those that are
- // not tied to sync-the-feature).
- ModelTypeSet GetModelTypesForTransportOnlyMode() const;
- // If in transport-only mode, returns only preferred data types which are
- // allowed in transport-only mode. Otherwise, returns all preferred data
- // types.
- ModelTypeSet GetDataTypesToConfigure() const;
- void UpdateDataTypesForInvalidations();
- // Shuts down and destroys the engine. |reason| dictates if sync metadata
- // should be kept or not.
- // If the engine is still allowed to run (per IsEngineAllowedToRun()), it will
- // soon start up again (possibly in transport-only mode).
- void ResetEngine(ShutdownReason shutdown_reason,
- ResetEngineReason reset_reason);
- // Helper for OnUnrecoverableError.
- void OnUnrecoverableErrorImpl(const base::Location& from_here,
- const std::string& message,
- UnrecoverableErrorReason reason);
- // Puts the engine's sync scheduler into NORMAL mode.
- // Called when configuration is complete.
- void StartSyncingWithServer();
- // Notify all observers that a change has occurred.
- void NotifyObservers();
- void NotifySyncCycleCompleted();
- void NotifyShutdown();
- void ClearUnrecoverableError();
- // Kicks off asynchronous initialization of the SyncEngine.
- void StartUpSlowEngineComponents();
- // Whether sync has been authenticated with an account ID.
- bool IsSignedIn() const;
- // Tell the sync server that this client has disabled sync.
- void RemoveClientFromServer() const;
- // Records per type histograms for estimated memory usage and number of
- // entities.
- void RecordMemoryUsageAndCountsHistograms();
- // True if setup has been completed at least once and is not in progress.
- bool CanConfigureDataTypes(bool bypass_setup_in_progress_check) const;
- // Called when a SetupInProgressHandle issued by this instance is destroyed.
- void OnSetupInProgressHandleDestroyed();
- // This profile's SyncClient, which abstracts away non-Sync dependencies and
- // the Sync API component factory.
- const std::unique_ptr<SyncClient> sync_client_;
- // The class that handles getting, setting, and persisting sync preferences.
- SyncPrefs sync_prefs_;
- // Encapsulates user signin - used to set/get the user's authenticated
- // email address and sign-out upon error.
- // May be null (if local Sync is enabled).
- const raw_ptr<signin::IdentityManager> identity_manager_;
- // The user-configurable knobs. Non-null between Initialize() and Shutdown().
- std::unique_ptr<SyncUserSettingsImpl> user_settings_;
- // Handles tracking of the authenticated account and acquiring access tokens.
- // Only null after Shutdown().
- std::unique_ptr<SyncAuthManager> auth_manager_;
- const version_info::Channel channel_;
- // An identifier representing this instance for debugging purposes.
- const std::string debug_identifier_;
- // This specifies where to find the sync server.
- const GURL sync_service_url_;
- // A utility object containing logic and state relating to encryption.
- SyncServiceCrypto crypto_;
- // Our asynchronous engine to communicate with sync components living on
- // other threads.
- std::unique_ptr<SyncEngine> engine_;
- // Used to ensure that certain operations are performed on the sequence that
- // this object was created on.
- SEQUENCE_CHECKER(sequence_checker_);
- // Cache of the last SyncCycleSnapshot received from the sync engine.
- SyncCycleSnapshot last_snapshot_;
- // The URL loader factory for the sync.
- scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_;
- // The global NetworkConnectionTracker instance.
- raw_ptr<network::NetworkConnectionTracker> network_connection_tracker_;
- // Indicates if this is the first time sync is being configured.
- // This is set to true if last synced time is not set at the time of
- // OnEngineInitialized().
- bool is_first_time_sync_configure_;
- // Number of UIs currently configuring the Sync service. When this number
- // is decremented back to zero, Sync setup is marked no longer in progress.
- int outstanding_setup_in_progress_handles_ = 0;
- // Set when sync receives STOP_SYNC_FOR_DISABLED_ACCOUNT error from server.
- // Prevents SyncServiceImpl from starting engine till browser restarted
- // or user signed out.
- bool sync_disabled_by_admin_;
- // Information describing an unrecoverable error.
- absl::optional<UnrecoverableErrorReason> unrecoverable_error_reason_ =
- absl::nullopt;
- std::string unrecoverable_error_message_;
- base::Location unrecoverable_error_location_;
- // Manages the start and stop of the data types.
- std::unique_ptr<DataTypeManager> data_type_manager_;
- // Note: This is an Optional so that we can control its destruction - in
- // particular, to trigger the "check_empty" test in Shutdown().
- absl::optional<base::ObserverList<SyncServiceObserver,
- /*check_empty=*/true>::Unchecked>
- observers_;
- base::ObserverList<ProtocolEventObserver>::Unchecked
- protocol_event_observers_;
- // This allows us to gracefully handle an ABORTED return code from the
- // DataTypeManager in the event that the server informed us to cease and
- // desist syncing immediately.
- bool expect_sync_configuration_aborted_;
- std::unique_ptr<BackendMigrator> migrator_;
- // This is the last |SyncProtocolError| we received from the server that had
- // an action set on it.
- SyncProtocolError last_actionable_error_;
- // Tracks the set of failed data types (those that encounter an error
- // or must delay loading for some reason).
- DataTypeStatusTable::TypeErrorMap data_type_error_map_;
- // List of available data type controllers.
- DataTypeController::TypeMap data_type_controllers_;
- CreateHttpPostProviderFactory create_http_post_provider_factory_cb_;
- const StartBehavior start_behavior_;
- std::unique_ptr<StartupController> startup_controller_;
- std::unique_ptr<SyncStoppedReporter> sync_stopped_reporter_;
- // Used in OnSyncRequestedPrefChange() to know whether the notification was
- // caused by the service itself setting the pref.
- bool is_setting_sync_requested_;
- // Used for UMA to determine whether TrustedVaultErrorShownOnStartup
- // histogram needs to recorded. Set to false iff histogram was already
- // recorded or trusted vault passphrase type wasn't used on startup.
- bool should_record_trusted_vault_error_shown_on_startup_;
- // Whether we want to receive invalidations for the SESSIONS data type. This
- // is typically false on Android (to save network traffic), but true on all
- // other platforms.
- bool sessions_invalidations_enabled_;
- GoogleServiceAuthError last_error_state_of_refresh_token_;
- // This weak factory invalidates its issued pointers when Sync is disabled.
- base::WeakPtrFactory<SyncServiceImpl> sync_enabled_weak_factory_{this};
- base::WeakPtrFactory<SyncServiceImpl> weak_factory_{this};
- };
- } // namespace syncer
- #endif // COMPONENTS_SYNC_DRIVER_SYNC_SERVICE_IMPL_H_
|