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 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_UNIFIED_CONSENT_UNIFIED_CONSENT_SERVICE_H_
#define COMPONENTS_UNIFIED_CONSENT_UNIFIED_CONSENT_SERVICE_H_
#include <map>
#include <memory>
#include <string>
#include <vector>
#include "base/memory/raw_ptr.h"
#include "base/values.h"
#include "components/keyed_service/core/keyed_service.h"
#include "components/prefs/pref_change_registrar.h"
#include "components/signin/public/identity_manager/identity_manager.h"
#include "components/sync/service/sync_service_observer.h"
#include "components/sync_preferences/pref_service_syncable_observer.h"
namespace user_prefs {
class PrefRegistrySyncable;
}
namespace sync_preferences {
class PrefServiceSyncable;
}
namespace syncer {
class SyncService;
}
namespace unified_consent {
#if BUILDFLAG(IS_CHROMEOS)
enum class MigrationState : int {
kNotInitialized = 0,
kInProgressWaitForSyncInit = 1,
// Reserve space for other kInProgress* entries to be added here.
kCompleted = 10,
};
#endif // BUILDFLAG(IS_CHROMEOS)
// A browser-context keyed service that is used to manage the user consent
// when UnifiedConsent feature is enabled.
//
// This service makes sure that UrlKeyedAnonymizedDataCollection is turned on
// during sync opt-in and turned off when the user opts out.
//
// During the advanced opt-in through settings, the changes the user makes to
// the service toggles(prefs) are applied after prefs start syncing. This is
// done to prevent changes the user makes during sync setup to be overridden by
// syncing down older changes.
class UnifiedConsentService
: public KeyedService,
public signin::IdentityManager::Observer,
public syncer::SyncServiceObserver,
public sync_preferences::PrefServiceSyncableObserver {
public:
// Initializes the service. The |service_pref_names| vector is used to track
// pref changes during the first sync setup.
UnifiedConsentService(sync_preferences::PrefServiceSyncable* pref_service,
signin::IdentityManager* identity_manager,
syncer::SyncService* sync_service,
const std::vector<std::string>& service_pref_names);
UnifiedConsentService(const UnifiedConsentService&) = delete;
UnifiedConsentService& operator=(const UnifiedConsentService&) = delete;
~UnifiedConsentService() override;
// Register the prefs used by this UnifiedConsentService.
static void RegisterPrefs(user_prefs::PrefRegistrySyncable* registry);
// Enables or disables URL-keyed anonymized data collection.
void SetUrlKeyedAnonymizedDataCollectionEnabled(bool enabled);
// KeyedService:
void Shutdown() override;
// IdentityManager::Observer:
void OnPrimaryAccountChanged(
const signin::PrimaryAccountChangeEvent& event) override;
private:
friend class UnifiedConsentServiceTest;
enum class SyncState {
// The user is not signed in.
kSignedOut,
// The user is signed in, but has not opted in to history.
kSignedInWithoutHistory,
// The user is signed in and has opted in to history. The passphrase state
// (explicit passphrase or not) is not known yet - it will be determined
// once the Sync engine successfully initializes for the first time. This
// typically happens very soon (< 1s) after sign-in, but in some cases (e.g.
// no connection to the Sync server possible) can be delayed indefinitely.
// When entering this state, data collection will get enabled - if it's
// later determined that there is an explicit passphrase, it'll get disabled
// again.
kSignedInWithHistoryWaitingForPassphrase,
// The user is signed in and has opted in to history, but has an explicit
// passphrase.
kSignedInWithHistoryAndExplicitPassphrase,
// The user is signed in and has opted in to history, and does not have an
// explicit passphrase.
kSignedInWithHistoryAndNoPassphrase,
};
static SyncState GetSyncState(const syncer::SyncService* sync_service);
static bool ShouldEnableUrlKeyedAnonymizedDataCollection(
SyncState old_sync_state,
SyncState new_sync_state);
static bool ShouldDisableUrlKeyedAnonymizedDataCollection(
SyncState old_sync_state,
SyncState new_sync_state);
// syncer::SyncServiceObserver:
void OnStateChanged(syncer::SyncService* sync) override;
// sync_preferences::PrefServiceSyncableObserver:
void OnIsSyncingChanged() override;
// Helpers for observing changes in the service prefs.
void StartObservingServicePrefChanges();
void StopObservingServicePrefChanges();
void ServicePrefChanged(const std::string& name);
#if BUILDFLAG(IS_CHROMEOS)
// Migration helpers.
MigrationState GetMigrationState();
void SetMigrationState(MigrationState migration_state);
// Called when the unified consent service is created.
void MigrateProfileToUnifiedConsent();
// Updates the settings preferences for the migration when the sync engine is
// initialized. When it is not, this function will be called again from
// |OnStateChanged| when the sync engine is initialized.
void UpdateSettingsForMigration();
#endif
raw_ptr<sync_preferences::PrefServiceSyncable> pref_service_;
raw_ptr<signin::IdentityManager> identity_manager_;
raw_ptr<syncer::SyncService> sync_service_;
// Used to monitor changes to the history opt-in and the explicit-passphrase
// state. Only populated and used if `kReplaceSyncPromosWithSignInPromos` is
// enabled.
SyncState last_sync_state_ = SyncState::kSignedOut;
// Used for tracking the service pref states during the advanced sync opt-in.
const std::vector<std::string> service_pref_names_;
std::map<std::string, base::Value> service_pref_changes_;
PrefChangeRegistrar service_pref_change_registrar_;
};
} // namespace unified_consent
#endif // COMPONENTS_UNIFIED_CONSENT_UNIFIED_CONSENT_SERVICE_H_
|