sync_user_settings_impl.cc 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. // Copyright 2018 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "components/sync/driver/sync_user_settings_impl.h"
  5. #include <utility>
  6. #include "base/feature_list.h"
  7. #include "base/logging.h"
  8. #include "base/metrics/histogram_macros.h"
  9. #include "base/version.h"
  10. #include "build/chromeos_buildflags.h"
  11. #include "components/sync/base/features.h"
  12. #include "components/sync/base/sync_prefs.h"
  13. #include "components/sync/base/user_selectable_type.h"
  14. #include "components/sync/driver/sync_service_crypto.h"
  15. #include "components/sync/engine/nigori/nigori.h"
  16. #include "components/version_info/version_info.h"
  17. #if BUILDFLAG(IS_CHROMEOS_ASH)
  18. #include "ash/constants/ash_features.h"
  19. #endif
  20. namespace syncer {
  21. namespace {
  22. // Converts |selected_types| to the corresponding ModelTypeSet (e.g.
  23. // {kExtensions} becomes {EXTENSIONS, EXTENSION_SETTINGS}).
  24. ModelTypeSet UserSelectableTypesToModelTypes(
  25. UserSelectableTypeSet selected_types) {
  26. ModelTypeSet preferred_types;
  27. for (UserSelectableType type : selected_types) {
  28. preferred_types.PutAll(UserSelectableTypeToAllModelTypes(type));
  29. }
  30. return preferred_types;
  31. }
  32. #if BUILDFLAG(IS_CHROMEOS_ASH)
  33. ModelTypeSet UserSelectableOsTypesToModelTypes(
  34. UserSelectableOsTypeSet selected_types) {
  35. ModelTypeSet preferred_types;
  36. for (UserSelectableOsType type : selected_types) {
  37. preferred_types.PutAll(UserSelectableOsTypeToAllModelTypes(type));
  38. }
  39. return preferred_types;
  40. }
  41. #endif // BUILDFLAG(IS_CHROMEOS_ASH)
  42. int GetCurrentMajorProductVersion() {
  43. DCHECK(version_info::GetVersion().IsValid());
  44. return version_info::GetVersion().components()[0];
  45. }
  46. } // namespace
  47. SyncUserSettingsImpl::SyncUserSettingsImpl(
  48. SyncServiceCrypto* crypto,
  49. SyncPrefs* prefs,
  50. const SyncTypePreferenceProvider* preference_provider,
  51. ModelTypeSet registered_model_types)
  52. : crypto_(crypto),
  53. prefs_(prefs),
  54. preference_provider_(preference_provider),
  55. registered_model_types_(registered_model_types) {
  56. DCHECK(crypto_);
  57. DCHECK(prefs_);
  58. }
  59. SyncUserSettingsImpl::~SyncUserSettingsImpl() = default;
  60. bool SyncUserSettingsImpl::IsSyncRequested() const {
  61. return prefs_->IsSyncRequested();
  62. }
  63. void SyncUserSettingsImpl::SetSyncRequested(bool requested) {
  64. prefs_->SetSyncRequested(requested);
  65. }
  66. bool SyncUserSettingsImpl::IsFirstSetupComplete() const {
  67. return prefs_->IsFirstSetupComplete();
  68. }
  69. void SyncUserSettingsImpl::SetFirstSetupComplete(
  70. SyncFirstSetupCompleteSource source) {
  71. if (IsFirstSetupComplete())
  72. return;
  73. UMA_HISTOGRAM_ENUMERATION("Signin.SyncFirstSetupCompleteSource", source);
  74. prefs_->SetFirstSetupComplete();
  75. }
  76. bool SyncUserSettingsImpl::IsSyncEverythingEnabled() const {
  77. return prefs_->HasKeepEverythingSynced();
  78. }
  79. UserSelectableTypeSet SyncUserSettingsImpl::GetSelectedTypes() const {
  80. UserSelectableTypeSet types = prefs_->GetSelectedTypes();
  81. types.RetainAll(GetRegisteredSelectableTypes());
  82. #if BUILDFLAG(IS_CHROMEOS_LACROS)
  83. if (base::FeatureList::IsEnabled(kSyncChromeOSAppsToggleSharing) &&
  84. GetRegisteredSelectableTypes().Has(UserSelectableType::kApps)) {
  85. // Apps sync is controlled by dedicated preference on Lacros, corresponding
  86. // to Apps toggle in OS Sync settings.
  87. types.Remove(UserSelectableType::kApps);
  88. if (prefs_->IsAppsSyncEnabledByOs()) {
  89. types.Put(UserSelectableType::kApps);
  90. }
  91. }
  92. #endif // BUILDFLAG(IS_CHROMEOS_LACROS)
  93. return types;
  94. }
  95. void SyncUserSettingsImpl::SetSelectedTypes(bool sync_everything,
  96. UserSelectableTypeSet types) {
  97. UserSelectableTypeSet registered_types = GetRegisteredSelectableTypes();
  98. DCHECK(registered_types.HasAll(types))
  99. << "\n registered: " << UserSelectableTypeSetToString(registered_types)
  100. << "\n setting to: " << UserSelectableTypeSetToString(types);
  101. prefs_->SetSelectedTypes(sync_everything, registered_types, types);
  102. }
  103. UserSelectableTypeSet SyncUserSettingsImpl::GetRegisteredSelectableTypes()
  104. const {
  105. UserSelectableTypeSet registered_types;
  106. for (UserSelectableType type : UserSelectableTypeSet::All()) {
  107. if (!base::Intersection(registered_model_types_,
  108. UserSelectableTypeToAllModelTypes(type))
  109. .Empty()) {
  110. registered_types.Put(type);
  111. }
  112. }
  113. return registered_types;
  114. }
  115. #if BUILDFLAG(IS_CHROMEOS_ASH)
  116. bool SyncUserSettingsImpl::IsSyncAllOsTypesEnabled() const {
  117. DCHECK(chromeos::features::IsSyncSettingsCategorizationEnabled());
  118. return prefs_->IsSyncAllOsTypesEnabled();
  119. }
  120. UserSelectableOsTypeSet SyncUserSettingsImpl::GetSelectedOsTypes() const {
  121. DCHECK(chromeos::features::IsSyncSettingsCategorizationEnabled());
  122. UserSelectableOsTypeSet types = prefs_->GetSelectedOsTypes();
  123. types.RetainAll(GetRegisteredSelectableOsTypes());
  124. return types;
  125. }
  126. void SyncUserSettingsImpl::SetSelectedOsTypes(bool sync_all_os_types,
  127. UserSelectableOsTypeSet types) {
  128. DCHECK(chromeos::features::IsSyncSettingsCategorizationEnabled());
  129. UserSelectableOsTypeSet registered_types = GetRegisteredSelectableOsTypes();
  130. DCHECK(registered_types.HasAll(types));
  131. prefs_->SetSelectedOsTypes(sync_all_os_types, registered_types, types);
  132. }
  133. UserSelectableOsTypeSet SyncUserSettingsImpl::GetRegisteredSelectableOsTypes()
  134. const {
  135. DCHECK(chromeos::features::IsSyncSettingsCategorizationEnabled());
  136. UserSelectableOsTypeSet registered_types;
  137. for (UserSelectableOsType type : UserSelectableOsTypeSet::All()) {
  138. if (!base::Intersection(registered_model_types_,
  139. UserSelectableOsTypeToAllModelTypes(type))
  140. .Empty()) {
  141. registered_types.Put(type);
  142. }
  143. }
  144. return registered_types;
  145. }
  146. #endif // BUILDFLAG(IS_CHROMEOS_ASH)
  147. #if BUILDFLAG(IS_CHROMEOS_LACROS)
  148. void SyncUserSettingsImpl::SetAppsSyncEnabledByOs(bool apps_sync_enabled) {
  149. DCHECK(base::FeatureList::IsEnabled(kSyncChromeOSAppsToggleSharing));
  150. prefs_->SetAppsSyncEnabledByOs(apps_sync_enabled);
  151. }
  152. #endif // BUILDFLAG(IS_CHROMEOS_LACROS)
  153. bool SyncUserSettingsImpl::IsCustomPassphraseAllowed() const {
  154. return !preference_provider_ ||
  155. preference_provider_->IsCustomPassphraseAllowed();
  156. }
  157. bool SyncUserSettingsImpl::IsEncryptEverythingEnabled() const {
  158. return crypto_->IsEncryptEverythingEnabled();
  159. }
  160. bool SyncUserSettingsImpl::IsPassphraseRequired() const {
  161. return crypto_->IsPassphraseRequired();
  162. }
  163. bool SyncUserSettingsImpl::IsPassphraseRequiredForPreferredDataTypes() const {
  164. // If there is an encrypted datatype enabled and we don't have the proper
  165. // passphrase, we must prompt the user for a passphrase. The only way for the
  166. // user to avoid entering their passphrase is to disable the encrypted types.
  167. return IsEncryptedDatatypeEnabled() && IsPassphraseRequired();
  168. }
  169. bool SyncUserSettingsImpl::IsPassphrasePromptMutedForCurrentProductVersion()
  170. const {
  171. return prefs_->GetPassphrasePromptMutedProductVersion() ==
  172. GetCurrentMajorProductVersion();
  173. }
  174. void SyncUserSettingsImpl::MarkPassphrasePromptMutedForCurrentProductVersion() {
  175. prefs_->SetPassphrasePromptMutedProductVersion(
  176. GetCurrentMajorProductVersion());
  177. }
  178. bool SyncUserSettingsImpl::IsTrustedVaultKeyRequired() const {
  179. return crypto_->IsTrustedVaultKeyRequired();
  180. }
  181. bool SyncUserSettingsImpl::IsTrustedVaultKeyRequiredForPreferredDataTypes()
  182. const {
  183. return IsEncryptedDatatypeEnabled() && crypto_->IsTrustedVaultKeyRequired();
  184. }
  185. bool SyncUserSettingsImpl::IsTrustedVaultRecoverabilityDegraded() const {
  186. return IsEncryptedDatatypeEnabled() &&
  187. crypto_->IsTrustedVaultRecoverabilityDegraded();
  188. }
  189. bool SyncUserSettingsImpl::IsUsingExplicitPassphrase() const {
  190. return crypto_->IsUsingExplicitPassphrase();
  191. }
  192. base::Time SyncUserSettingsImpl::GetExplicitPassphraseTime() const {
  193. return crypto_->GetExplicitPassphraseTime();
  194. }
  195. PassphraseType SyncUserSettingsImpl::GetPassphraseType() const {
  196. return crypto_->GetPassphraseType();
  197. }
  198. void SyncUserSettingsImpl::SetEncryptionPassphrase(
  199. const std::string& passphrase) {
  200. crypto_->SetEncryptionPassphrase(passphrase);
  201. }
  202. bool SyncUserSettingsImpl::SetDecryptionPassphrase(
  203. const std::string& passphrase) {
  204. DCHECK(IsPassphraseRequired())
  205. << "SetDecryptionPassphrase must not be called when "
  206. "IsPassphraseRequired() is false.";
  207. DVLOG(1) << "Setting passphrase for decryption.";
  208. return crypto_->SetDecryptionPassphrase(passphrase);
  209. }
  210. void SyncUserSettingsImpl::SetDecryptionNigoriKey(
  211. std::unique_ptr<Nigori> nigori) {
  212. return crypto_->SetDecryptionNigoriKey(std::move(nigori));
  213. }
  214. std::unique_ptr<Nigori> SyncUserSettingsImpl::GetDecryptionNigoriKey() const {
  215. return crypto_->GetDecryptionNigoriKey();
  216. }
  217. void SyncUserSettingsImpl::SetSyncRequestedIfNotSetExplicitly() {
  218. prefs_->SetSyncRequestedIfNotSetExplicitly();
  219. }
  220. ModelTypeSet SyncUserSettingsImpl::GetPreferredDataTypes() const {
  221. ModelTypeSet types = UserSelectableTypesToModelTypes(GetSelectedTypes());
  222. types.PutAll(AlwaysPreferredUserTypes());
  223. #if BUILDFLAG(IS_CHROMEOS_ASH)
  224. if (chromeos::features::IsSyncSettingsCategorizationEnabled()) {
  225. types.PutAll(UserSelectableOsTypesToModelTypes(GetSelectedOsTypes()));
  226. }
  227. #endif
  228. types.RetainAll(registered_model_types_);
  229. static_assert(40 == GetNumModelTypes(),
  230. "If adding a new sync data type, update the list below below if"
  231. " you want to disable the new data type for local sync.");
  232. types.PutAll(ControlTypes());
  233. if (prefs_->IsLocalSyncEnabled()) {
  234. types.Remove(APP_LIST);
  235. types.Remove(AUTOFILL_WALLET_OFFER);
  236. types.Remove(SECURITY_EVENTS);
  237. types.Remove(SEND_TAB_TO_SELF);
  238. types.Remove(SHARING_MESSAGE);
  239. types.Remove(USER_CONSENTS);
  240. types.Remove(USER_EVENTS);
  241. types.Remove(WORKSPACE_DESK);
  242. }
  243. return types;
  244. }
  245. ModelTypeSet SyncUserSettingsImpl::GetEncryptedDataTypes() const {
  246. return crypto_->GetEncryptedDataTypes();
  247. }
  248. bool SyncUserSettingsImpl::IsEncryptedDatatypeEnabled() const {
  249. const ModelTypeSet preferred_types = GetPreferredDataTypes();
  250. const ModelTypeSet encrypted_types = GetEncryptedDataTypes();
  251. DCHECK(encrypted_types.HasAll(AlwaysEncryptedUserTypes()));
  252. return !Intersection(preferred_types, encrypted_types).Empty();
  253. }
  254. } // namespace syncer