| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "components/browser_sync/profile_sync_service.h" | 5 #include "components/browser_sync/profile_sync_service.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <cstddef> | 9 #include <cstddef> |
| 10 #include <map> | 10 #include <map> |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 111 using syncer::SyncCredentials; | 111 using syncer::SyncCredentials; |
| 112 using syncer::SyncProtocolError; | 112 using syncer::SyncProtocolError; |
| 113 using syncer::WeakHandle; | 113 using syncer::WeakHandle; |
| 114 | 114 |
| 115 namespace browser_sync { | 115 namespace browser_sync { |
| 116 | 116 |
| 117 namespace { | 117 namespace { |
| 118 | 118 |
| 119 typedef GoogleServiceAuthError AuthError; | 119 typedef GoogleServiceAuthError AuthError; |
| 120 | 120 |
| 121 // Events in ClearServerData flow to be recorded in histogram. Existing | |
| 122 // constants should not be deleted or reordered. New ones shold be added at the | |
| 123 // end, before CLEAR_SERVER_DATA_MAX. | |
| 124 enum ClearServerDataEvents { | |
| 125 // ClearServerData started after user switched to custom passphrase. | |
| 126 CLEAR_SERVER_DATA_STARTED, | |
| 127 // DataTypeManager reported that catchup configuration failed. | |
| 128 CLEAR_SERVER_DATA_CATCHUP_FAILED, | |
| 129 // ClearServerData flow restarted after browser restart. | |
| 130 CLEAR_SERVER_DATA_RETRIED, | |
| 131 // Success. | |
| 132 CLEAR_SERVER_DATA_SUCCEEDED, | |
| 133 // Client received RECET_LOCAL_SYNC_DATA after custom passphrase was enabled | |
| 134 // on different client. | |
| 135 CLEAR_SERVER_DATA_RESET_LOCAL_DATA_RECEIVED, | |
| 136 CLEAR_SERVER_DATA_MAX | |
| 137 }; | |
| 138 | |
| 139 const char kClearServerDataEventsHistogramName[] = "Sync.ClearServerDataEvents"; | |
| 140 | |
| 141 const char kSyncUnrecoverableErrorHistogram[] = "Sync.UnrecoverableErrors"; | 121 const char kSyncUnrecoverableErrorHistogram[] = "Sync.UnrecoverableErrors"; |
| 142 | 122 |
| 143 const net::BackoffEntry::Policy kRequestAccessTokenBackoffPolicy = { | 123 const net::BackoffEntry::Policy kRequestAccessTokenBackoffPolicy = { |
| 144 // Number of initial errors (in sequence) to ignore before applying | 124 // Number of initial errors (in sequence) to ignore before applying |
| 145 // exponential back-off rules. | 125 // exponential back-off rules. |
| 146 0, | 126 0, |
| 147 | 127 |
| 148 // Initial delay for exponential back-off in ms. | 128 // Initial delay for exponential back-off in ms. |
| 149 2000, | 129 2000, |
| 150 | 130 |
| (...skipping 27 matching lines...) Expand all Loading... |
| 178 ProfileSyncService::InitParams::~InitParams() = default; | 158 ProfileSyncService::InitParams::~InitParams() = default; |
| 179 | 159 |
| 180 ProfileSyncService::ProfileSyncService(InitParams init_params) | 160 ProfileSyncService::ProfileSyncService(InitParams init_params) |
| 181 : SyncServiceBase(std::move(init_params.sync_client), | 161 : SyncServiceBase(std::move(init_params.sync_client), |
| 182 std::move(init_params.signin_wrapper), | 162 std::move(init_params.signin_wrapper), |
| 183 init_params.channel, | 163 init_params.channel, |
| 184 init_params.base_directory, | 164 init_params.base_directory, |
| 185 init_params.debug_identifier), | 165 init_params.debug_identifier), |
| 186 OAuth2TokenService::Consumer("sync"), | 166 OAuth2TokenService::Consumer("sync"), |
| 187 last_auth_error_(AuthError::AuthErrorNone()), | 167 last_auth_error_(AuthError::AuthErrorNone()), |
| 188 passphrase_required_reason_(syncer::REASON_PASSPHRASE_NOT_REQUIRED), | |
| 189 sync_service_url_( | 168 sync_service_url_( |
| 190 syncer::GetSyncServiceURL(*base::CommandLine::ForCurrentProcess(), | 169 syncer::GetSyncServiceURL(*base::CommandLine::ForCurrentProcess(), |
| 191 init_params.channel)), | 170 init_params.channel)), |
| 192 network_time_update_callback_( | 171 network_time_update_callback_( |
| 193 std::move(init_params.network_time_update_callback)), | 172 std::move(init_params.network_time_update_callback)), |
| 194 url_request_context_(init_params.url_request_context), | 173 url_request_context_(init_params.url_request_context), |
| 195 blocking_task_runner_(std::move(init_params.blocking_task_runner)), | 174 blocking_task_runner_(std::move(init_params.blocking_task_runner)), |
| 196 is_first_time_sync_configure_(false), | 175 is_first_time_sync_configure_(false), |
| 197 engine_initialized_(false), | 176 engine_initialized_(false), |
| 198 sync_disabled_by_admin_(false), | 177 sync_disabled_by_admin_(false), |
| 199 is_auth_in_progress_(false), | 178 is_auth_in_progress_(false), |
| 200 local_sync_backend_folder_(init_params.local_sync_backend_folder), | 179 local_sync_backend_folder_(init_params.local_sync_backend_folder), |
| 201 unrecoverable_error_reason_(ERROR_REASON_UNSET), | 180 unrecoverable_error_reason_(ERROR_REASON_UNSET), |
| 202 expect_sync_configuration_aborted_(false), | 181 expect_sync_configuration_aborted_(false), |
| 203 encrypted_types_(syncer::SyncEncryptionHandler::SensitiveTypes()), | |
| 204 encrypt_everything_allowed_(true), | |
| 205 encrypt_everything_(false), | |
| 206 encryption_pending_(false), | |
| 207 configure_status_(DataTypeManager::UNKNOWN), | 182 configure_status_(DataTypeManager::UNKNOWN), |
| 208 oauth2_token_service_(init_params.oauth2_token_service), | 183 oauth2_token_service_(init_params.oauth2_token_service), |
| 209 request_access_token_backoff_(&kRequestAccessTokenBackoffPolicy), | 184 request_access_token_backoff_(&kRequestAccessTokenBackoffPolicy), |
| 210 connection_status_(syncer::CONNECTION_NOT_ATTEMPTED), | 185 connection_status_(syncer::CONNECTION_NOT_ATTEMPTED), |
| 211 last_get_token_error_(GoogleServiceAuthError::AuthErrorNone()), | 186 last_get_token_error_(GoogleServiceAuthError::AuthErrorNone()), |
| 212 gaia_cookie_manager_service_(init_params.gaia_cookie_manager_service), | 187 gaia_cookie_manager_service_(init_params.gaia_cookie_manager_service), |
| 213 network_resources_(new syncer::HttpBridgeNetworkResources), | 188 network_resources_(new syncer::HttpBridgeNetworkResources), |
| 214 start_behavior_(init_params.start_behavior), | 189 start_behavior_(init_params.start_behavior), |
| 215 passphrase_prompt_triggered_by_version_(false), | 190 passphrase_prompt_triggered_by_version_(false), |
| 216 sync_enabled_weak_factory_(this), | 191 sync_enabled_weak_factory_(this), |
| (...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 366 } else { | 341 } else { |
| 367 startup_controller_->TryStart(); | 342 startup_controller_->TryStart(); |
| 368 } | 343 } |
| 369 } | 344 } |
| 370 | 345 |
| 371 void ProfileSyncService::StartSyncingWithServer() { | 346 void ProfileSyncService::StartSyncingWithServer() { |
| 372 if (base::FeatureList::IsEnabled( | 347 if (base::FeatureList::IsEnabled( |
| 373 switches::kSyncClearDataOnPassphraseEncryption) && | 348 switches::kSyncClearDataOnPassphraseEncryption) && |
| 374 sync_prefs_.GetPassphraseEncryptionTransitionInProgress()) { | 349 sync_prefs_.GetPassphraseEncryptionTransitionInProgress()) { |
| 375 // We are restarting catchup configuration after browser restart. | 350 // We are restarting catchup configuration after browser restart. |
| 376 UMA_HISTOGRAM_ENUMERATION(kClearServerDataEventsHistogramName, | 351 UMA_HISTOGRAM_ENUMERATION("Sync.ClearServerDataEvents", |
| 377 CLEAR_SERVER_DATA_RETRIED, CLEAR_SERVER_DATA_MAX); | 352 syncer::CLEAR_SERVER_DATA_RETRIED, |
| 353 syncer::CLEAR_SERVER_DATA_MAX); |
| 378 | 354 |
| 379 BeginConfigureCatchUpBeforeClear(); | 355 crypto_->BeginConfigureCatchUpBeforeClear(); |
| 380 return; | 356 return; |
| 381 } | 357 } |
| 382 | 358 |
| 383 if (engine_) | 359 if (engine_) |
| 384 engine_->StartSyncingWithServer(); | 360 engine_->StartSyncingWithServer(); |
| 385 } | 361 } |
| 386 | 362 |
| 387 void ProfileSyncService::RegisterAuthNotifications() { | 363 void ProfileSyncService::RegisterAuthNotifications() { |
| 388 DCHECK(thread_checker_.CalledOnValidThread()); | 364 DCHECK(thread_checker_.CalledOnValidThread()); |
| 389 oauth2_token_service_->AddObserver(this); | 365 oauth2_token_service_->AddObserver(this); |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 495 return syncer::MakeWeakHandle(sync_js_controller_.AsWeakPtr()); | 471 return syncer::MakeWeakHandle(sync_js_controller_.AsWeakPtr()); |
| 496 } | 472 } |
| 497 | 473 |
| 498 syncer::SyncEngine::HttpPostProviderFactoryGetter | 474 syncer::SyncEngine::HttpPostProviderFactoryGetter |
| 499 ProfileSyncService::MakeHttpPostProviderFactoryGetter() { | 475 ProfileSyncService::MakeHttpPostProviderFactoryGetter() { |
| 500 return base::Bind(&syncer::NetworkResources::GetHttpPostProviderFactory, | 476 return base::Bind(&syncer::NetworkResources::GetHttpPostProviderFactory, |
| 501 base::Unretained(network_resources_.get()), | 477 base::Unretained(network_resources_.get()), |
| 502 url_request_context_, network_time_update_callback_); | 478 url_request_context_, network_time_update_callback_); |
| 503 } | 479 } |
| 504 | 480 |
| 505 std::unique_ptr<syncer::SyncEncryptionHandler::NigoriState> | |
| 506 ProfileSyncService::MoveSavedNigoriState() { | |
| 507 return std::move(saved_nigori_state_); | |
| 508 } | |
| 509 | |
| 510 syncer::WeakHandle<syncer::UnrecoverableErrorHandler> | 481 syncer::WeakHandle<syncer::UnrecoverableErrorHandler> |
| 511 ProfileSyncService::GetUnrecoverableErrorHandler() { | 482 ProfileSyncService::GetUnrecoverableErrorHandler() { |
| 512 return syncer::MakeWeakHandle(sync_enabled_weak_factory_.GetWeakPtr()); | 483 return syncer::MakeWeakHandle(sync_enabled_weak_factory_.GetWeakPtr()); |
| 513 } | 484 } |
| 514 | 485 |
| 515 bool ProfileSyncService::IsEncryptedDatatypeEnabled() const { | 486 bool ProfileSyncService::IsEncryptedDatatypeEnabled() const { |
| 516 if (encryption_pending()) | 487 if (encryption_pending()) |
| 517 return true; | 488 return true; |
| 518 const syncer::ModelTypeSet preferred_types = GetPreferredDataTypes(); | 489 const syncer::ModelTypeSet preferred_types = GetPreferredDataTypes(); |
| 519 const syncer::ModelTypeSet encrypted_types = GetEncryptedDataTypes(); | 490 const syncer::ModelTypeSet encrypted_types = GetEncryptedDataTypes(); |
| (...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 768 | 739 |
| 769 startup_controller_->Reset(GetRegisteredDataTypes()); | 740 startup_controller_->Reset(GetRegisteredDataTypes()); |
| 770 | 741 |
| 771 // If the sync DB is getting destroyed, the local DeviceInfo is no longer | 742 // If the sync DB is getting destroyed, the local DeviceInfo is no longer |
| 772 // valid and should be cleared from the cache. | 743 // valid and should be cleared from the cache. |
| 773 if (reason == syncer::ShutdownReason::DISABLE_SYNC) { | 744 if (reason == syncer::ShutdownReason::DISABLE_SYNC) { |
| 774 local_device_->Clear(); | 745 local_device_->Clear(); |
| 775 } | 746 } |
| 776 | 747 |
| 777 // Clear various state. | 748 // Clear various state. |
| 749 ResetCryptoState(); |
| 778 expect_sync_configuration_aborted_ = false; | 750 expect_sync_configuration_aborted_ = false; |
| 779 is_auth_in_progress_ = false; | 751 is_auth_in_progress_ = false; |
| 780 engine_initialized_ = false; | 752 engine_initialized_ = false; |
| 781 cached_passphrase_.clear(); | |
| 782 encryption_pending_ = false; | |
| 783 encrypt_everything_ = false; | |
| 784 encrypted_types_ = syncer::SyncEncryptionHandler::SensitiveTypes(); | |
| 785 passphrase_required_reason_ = syncer::REASON_PASSPHRASE_NOT_REQUIRED; | |
| 786 access_token_.clear(); | 753 access_token_.clear(); |
| 787 request_access_token_retry_timer_.Stop(); | 754 request_access_token_retry_timer_.Stop(); |
| 788 last_snapshot_ = syncer::SyncCycleSnapshot(); | 755 last_snapshot_ = syncer::SyncCycleSnapshot(); |
| 789 // Revert to "no auth error". | 756 // Revert to "no auth error". |
| 790 if (last_auth_error_.state() != GoogleServiceAuthError::NONE) | 757 if (last_auth_error_.state() != GoogleServiceAuthError::NONE) |
| 791 UpdateAuthErrorState(GoogleServiceAuthError::AuthErrorNone()); | 758 UpdateAuthErrorState(GoogleServiceAuthError::AuthErrorNone()); |
| 792 | 759 |
| 793 NotifyObservers(); | 760 NotifyObservers(); |
| 794 | 761 |
| 795 // Mark this as a clean shutdown(without crash). | 762 // Mark this as a clean shutdown(without crash). |
| (...skipping 25 matching lines...) Expand all Loading... |
| 821 sync_prefs_.SetFirstSetupComplete(); | 788 sync_prefs_.SetFirstSetupComplete(); |
| 822 if (IsEngineInitialized()) { | 789 if (IsEngineInitialized()) { |
| 823 ReconfigureDatatypeManager(); | 790 ReconfigureDatatypeManager(); |
| 824 } | 791 } |
| 825 } | 792 } |
| 826 | 793 |
| 827 void ProfileSyncService::UpdateLastSyncedTime() { | 794 void ProfileSyncService::UpdateLastSyncedTime() { |
| 828 sync_prefs_.SetLastSyncedTime(base::Time::Now()); | 795 sync_prefs_.SetLastSyncedTime(base::Time::Now()); |
| 829 } | 796 } |
| 830 | 797 |
| 831 void ProfileSyncService::NotifyObservers() { | |
| 832 for (auto& observer : observers_) | |
| 833 observer.OnStateChanged(); | |
| 834 } | |
| 835 | |
| 836 void ProfileSyncService::NotifySyncCycleCompleted() { | 798 void ProfileSyncService::NotifySyncCycleCompleted() { |
| 837 for (auto& observer : observers_) | 799 for (auto& observer : observers_) |
| 838 observer.OnSyncCycleCompleted(); | 800 observer.OnSyncCycleCompleted(); |
| 839 } | 801 } |
| 840 | 802 |
| 841 void ProfileSyncService::NotifyForeignSessionUpdated() { | 803 void ProfileSyncService::NotifyForeignSessionUpdated() { |
| 842 for (auto& observer : observers_) | 804 for (auto& observer : observers_) |
| 843 observer.OnForeignSessionUpdated(); | 805 observer.OnForeignSessionUpdated(); |
| 844 } | 806 } |
| 845 | 807 |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 969 engine_->RequestBufferedProtocolEventsAndEnableForwarding(); | 931 engine_->RequestBufferedProtocolEventsAndEnableForwarding(); |
| 970 } | 932 } |
| 971 | 933 |
| 972 if (type_debug_info_observers_.might_have_observers()) { | 934 if (type_debug_info_observers_.might_have_observers()) { |
| 973 engine_->EnableDirectoryTypeDebugInfoForwarding(); | 935 engine_->EnableDirectoryTypeDebugInfoForwarding(); |
| 974 } | 936 } |
| 975 | 937 |
| 976 // If we have a cached passphrase use it to decrypt/encrypt data now that the | 938 // If we have a cached passphrase use it to decrypt/encrypt data now that the |
| 977 // backend is initialized. We want to call this before notifying observers in | 939 // backend is initialized. We want to call this before notifying observers in |
| 978 // case this operation affects the "passphrase required" status. | 940 // case this operation affects the "passphrase required" status. |
| 979 ConsumeCachedPassphraseIfPossible(); | 941 crypto_->ConsumeCachedPassphraseIfPossible(); |
| 980 | 942 |
| 981 // The very first time the backend initializes is effectively the first time | 943 // The very first time the backend initializes is effectively the first time |
| 982 // we can say we successfully "synced". LastSyncedTime will only be null in | 944 // we can say we successfully "synced". LastSyncedTime will only be null in |
| 983 // this case, because the pref wasn't restored on StartUp. | 945 // this case, because the pref wasn't restored on StartUp. |
| 984 if (sync_prefs_.GetLastSyncedTime().is_null()) { | 946 if (sync_prefs_.GetLastSyncedTime().is_null()) { |
| 985 UpdateLastSyncedTime(); | 947 UpdateLastSyncedTime(); |
| 986 } | 948 } |
| 987 | 949 |
| 988 data_type_manager_.reset( | 950 data_type_manager_.reset( |
| 989 sync_client_->GetSyncApiComponentFactory()->CreateDataTypeManager( | 951 sync_client_->GetSyncApiComponentFactory()->CreateDataTypeManager( |
| 990 initial_types, debug_info_listener_, &data_type_controllers_, this, | 952 initial_types, debug_info_listener_, &data_type_controllers_, this, |
| 991 engine_.get(), this)); | 953 engine_.get(), this)); |
| 992 | 954 |
| 955 crypto_->SetSyncEngine(engine_.get()); |
| 956 crypto_->SetDataTypeManager(data_type_manager_.get()); |
| 957 |
| 993 // Auto-start means IsFirstSetupComplete gets set automatically. | 958 // Auto-start means IsFirstSetupComplete gets set automatically. |
| 994 if (start_behavior_ == AUTO_START && !IsFirstSetupComplete()) { | 959 if (start_behavior_ == AUTO_START && !IsFirstSetupComplete()) { |
| 995 // This will trigger a configure if it completes setup. | 960 // This will trigger a configure if it completes setup. |
| 996 SetFirstSetupComplete(); | 961 SetFirstSetupComplete(); |
| 997 } else if (CanConfigureDataTypes()) { | 962 } else if (CanConfigureDataTypes()) { |
| 998 ConfigureDataTypeManager(); | 963 ConfigureDataTypeManager(); |
| 999 } | 964 } |
| 1000 | 965 |
| 1001 // Check for a cookie jar mismatch. | 966 // Check for a cookie jar mismatch. |
| 1002 std::vector<gaia::ListedAccount> accounts; | 967 std::vector<gaia::ListedAccount> accounts; |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1132 } | 1097 } |
| 1133 } | 1098 } |
| 1134 | 1099 |
| 1135 const GoogleServiceAuthError auth_error = | 1100 const GoogleServiceAuthError auth_error = |
| 1136 ConnectionStatusToAuthError(status); | 1101 ConnectionStatusToAuthError(status); |
| 1137 DVLOG(1) << "Connection status change: " << auth_error.ToString(); | 1102 DVLOG(1) << "Connection status change: " << auth_error.ToString(); |
| 1138 UpdateAuthErrorState(auth_error); | 1103 UpdateAuthErrorState(auth_error); |
| 1139 } | 1104 } |
| 1140 } | 1105 } |
| 1141 | 1106 |
| 1142 void ProfileSyncService::OnPassphraseRequired( | |
| 1143 syncer::PassphraseRequiredReason reason, | |
| 1144 const sync_pb::EncryptedData& pending_keys) { | |
| 1145 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 1146 DCHECK(engine_); | |
| 1147 DCHECK(engine_->IsNigoriEnabled()); | |
| 1148 | |
| 1149 // TODO(lipalani) : add this check to other locations as well. | |
| 1150 if (HasUnrecoverableError()) { | |
| 1151 // When unrecoverable error is detected we post a task to shutdown the | |
| 1152 // engine. The task might not have executed yet. | |
| 1153 return; | |
| 1154 } | |
| 1155 | |
| 1156 DVLOG(1) << "Passphrase required with reason: " | |
| 1157 << syncer::PassphraseRequiredReasonToString(reason); | |
| 1158 passphrase_required_reason_ = reason; | |
| 1159 | |
| 1160 const syncer::ModelTypeSet types = GetPreferredDataTypes(); | |
| 1161 if (data_type_manager_) { | |
| 1162 // Reconfigure without the encrypted types (excluded implicitly via the | |
| 1163 // failed datatypes handler). | |
| 1164 data_type_manager_->Configure(types, syncer::CONFIGURE_REASON_CRYPTO); | |
| 1165 } | |
| 1166 | |
| 1167 // Notify observers that the passphrase status may have changed. | |
| 1168 NotifyObservers(); | |
| 1169 } | |
| 1170 | |
| 1171 void ProfileSyncService::OnPassphraseAccepted() { | |
| 1172 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 1173 DVLOG(1) << "Received OnPassphraseAccepted."; | |
| 1174 | |
| 1175 // If the pending keys were resolved via keystore, it's possible we never | |
| 1176 // consumed our cached passphrase. Clear it now. | |
| 1177 if (!cached_passphrase_.empty()) | |
| 1178 cached_passphrase_.clear(); | |
| 1179 | |
| 1180 // Reset passphrase_required_reason_ since we know we no longer require the | |
| 1181 // passphrase. | |
| 1182 passphrase_required_reason_ = syncer::REASON_PASSPHRASE_NOT_REQUIRED; | |
| 1183 | |
| 1184 // Make sure the data types that depend on the passphrase are started at | |
| 1185 // this time. | |
| 1186 const syncer::ModelTypeSet types = GetPreferredDataTypes(); | |
| 1187 if (data_type_manager_) { | |
| 1188 // Re-enable any encrypted types if necessary. | |
| 1189 data_type_manager_->Configure(types, syncer::CONFIGURE_REASON_CRYPTO); | |
| 1190 } | |
| 1191 | |
| 1192 NotifyObservers(); | |
| 1193 } | |
| 1194 | |
| 1195 void ProfileSyncService::OnEncryptedTypesChanged( | |
| 1196 syncer::ModelTypeSet encrypted_types, | |
| 1197 bool encrypt_everything) { | |
| 1198 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 1199 encrypted_types_ = encrypted_types; | |
| 1200 encrypt_everything_ = encrypt_everything; | |
| 1201 DCHECK(encrypt_everything_allowed_ || !encrypt_everything_); | |
| 1202 DVLOG(1) << "Encrypted types changed to " | |
| 1203 << syncer::ModelTypeSetToString(encrypted_types_) | |
| 1204 << " (encrypt everything is set to " | |
| 1205 << (encrypt_everything_ ? "true" : "false") << ")"; | |
| 1206 DCHECK(encrypted_types_.Has(syncer::PASSWORDS)); | |
| 1207 | |
| 1208 NotifyObservers(); | |
| 1209 } | |
| 1210 | |
| 1211 void ProfileSyncService::OnEncryptionComplete() { | |
| 1212 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 1213 DVLOG(1) << "Encryption complete"; | |
| 1214 if (encryption_pending_ && encrypt_everything_) { | |
| 1215 encryption_pending_ = false; | |
| 1216 // This is to nudge the integration tests when encryption is | |
| 1217 // finished. | |
| 1218 NotifyObservers(); | |
| 1219 } | |
| 1220 } | |
| 1221 | |
| 1222 void ProfileSyncService::OnMigrationNeededForTypes(syncer::ModelTypeSet types) { | 1107 void ProfileSyncService::OnMigrationNeededForTypes(syncer::ModelTypeSet types) { |
| 1223 DCHECK(thread_checker_.CalledOnValidThread()); | 1108 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1224 DCHECK(engine_initialized_); | 1109 DCHECK(engine_initialized_); |
| 1225 DCHECK(data_type_manager_); | 1110 DCHECK(data_type_manager_); |
| 1226 | 1111 |
| 1227 // Migrator must be valid, because we don't sync until it is created and this | 1112 // Migrator must be valid, because we don't sync until it is created and this |
| 1228 // callback originates from a sync cycle. | 1113 // callback originates from a sync cycle. |
| 1229 migrator_->MigrateTypes(types); | 1114 migrator_->MigrateTypes(types); |
| 1230 } | 1115 } |
| 1231 | 1116 |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1266 break; | 1151 break; |
| 1267 case syncer::STOP_SYNC_FOR_DISABLED_ACCOUNT: | 1152 case syncer::STOP_SYNC_FOR_DISABLED_ACCOUNT: |
| 1268 // Sync disabled by domain admin. we should stop syncing until next | 1153 // Sync disabled by domain admin. we should stop syncing until next |
| 1269 // restart. | 1154 // restart. |
| 1270 sync_disabled_by_admin_ = true; | 1155 sync_disabled_by_admin_ = true; |
| 1271 ShutdownImpl(syncer::DISABLE_SYNC); | 1156 ShutdownImpl(syncer::DISABLE_SYNC); |
| 1272 break; | 1157 break; |
| 1273 case syncer::RESET_LOCAL_SYNC_DATA: | 1158 case syncer::RESET_LOCAL_SYNC_DATA: |
| 1274 ShutdownImpl(syncer::DISABLE_SYNC); | 1159 ShutdownImpl(syncer::DISABLE_SYNC); |
| 1275 startup_controller_->TryStart(); | 1160 startup_controller_->TryStart(); |
| 1276 UMA_HISTOGRAM_ENUMERATION(kClearServerDataEventsHistogramName, | 1161 UMA_HISTOGRAM_ENUMERATION( |
| 1277 CLEAR_SERVER_DATA_RESET_LOCAL_DATA_RECEIVED, | 1162 "Sync.ClearServerDataEvents", |
| 1278 CLEAR_SERVER_DATA_MAX); | 1163 syncer::CLEAR_SERVER_DATA_RESET_LOCAL_DATA_RECEIVED, |
| 1164 syncer::CLEAR_SERVER_DATA_MAX); |
| 1279 break; | 1165 break; |
| 1280 default: | 1166 default: |
| 1281 NOTREACHED(); | 1167 NOTREACHED(); |
| 1282 } | 1168 } |
| 1283 NotifyObservers(); | 1169 NotifyObservers(); |
| 1284 } | 1170 } |
| 1285 | 1171 |
| 1286 void ProfileSyncService::OnLocalSetPassphraseEncryption( | |
| 1287 const syncer::SyncEncryptionHandler::NigoriState& nigori_state) { | |
| 1288 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 1289 if (!base::FeatureList::IsEnabled( | |
| 1290 switches::kSyncClearDataOnPassphraseEncryption)) | |
| 1291 return; | |
| 1292 | |
| 1293 // At this point the user has set a custom passphrase and we have received the | |
| 1294 // updated nigori state. Time to cache the nigori state, and catch up the | |
| 1295 // active data types. | |
| 1296 UMA_HISTOGRAM_ENUMERATION(kClearServerDataEventsHistogramName, | |
| 1297 CLEAR_SERVER_DATA_STARTED, CLEAR_SERVER_DATA_MAX); | |
| 1298 sync_prefs_.SetNigoriSpecificsForPassphraseTransition( | |
| 1299 nigori_state.nigori_specifics); | |
| 1300 sync_prefs_.SetPassphraseEncryptionTransitionInProgress(true); | |
| 1301 BeginConfigureCatchUpBeforeClear(); | |
| 1302 } | |
| 1303 | |
| 1304 void ProfileSyncService::BeginConfigureCatchUpBeforeClear() { | |
| 1305 DCHECK(data_type_manager_); | |
| 1306 DCHECK(!saved_nigori_state_); | |
| 1307 saved_nigori_state_ = | |
| 1308 base::MakeUnique<syncer::SyncEncryptionHandler::NigoriState>(); | |
| 1309 sync_prefs_.GetNigoriSpecificsForPassphraseTransition( | |
| 1310 &saved_nigori_state_->nigori_specifics); | |
| 1311 const syncer::ModelTypeSet types = GetActiveDataTypes(); | |
| 1312 data_type_manager_->Configure(types, syncer::CONFIGURE_REASON_CATCH_UP); | |
| 1313 } | |
| 1314 | |
| 1315 void ProfileSyncService::ClearAndRestartSyncForPassphraseEncryption() { | 1172 void ProfileSyncService::ClearAndRestartSyncForPassphraseEncryption() { |
| 1316 DCHECK(thread_checker_.CalledOnValidThread()); | 1173 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1317 engine_->ClearServerData( | 1174 engine_->ClearServerData( |
| 1318 base::Bind(&ProfileSyncService::OnClearServerDataDone, | 1175 base::Bind(&ProfileSyncService::OnClearServerDataDone, |
| 1319 sync_enabled_weak_factory_.GetWeakPtr())); | 1176 sync_enabled_weak_factory_.GetWeakPtr())); |
| 1320 } | 1177 } |
| 1321 | 1178 |
| 1322 void ProfileSyncService::OnClearServerDataDone() { | 1179 void ProfileSyncService::OnClearServerDataDone() { |
| 1323 DCHECK(sync_prefs_.GetPassphraseEncryptionTransitionInProgress()); | 1180 DCHECK(sync_prefs_.GetPassphraseEncryptionTransitionInProgress()); |
| 1324 sync_prefs_.SetPassphraseEncryptionTransitionInProgress(false); | 1181 sync_prefs_.SetPassphraseEncryptionTransitionInProgress(false); |
| 1325 | 1182 |
| 1326 // Call to ClearServerData generates new keystore key on the server. This | 1183 // Call to ClearServerData generates new keystore key on the server. This |
| 1327 // makes keystore bootstrap token invalid. Let's clear it from preferences. | 1184 // makes keystore bootstrap token invalid. Let's clear it from preferences. |
| 1328 sync_prefs_.SetKeystoreEncryptionBootstrapToken(std::string()); | 1185 sync_prefs_.SetKeystoreEncryptionBootstrapToken(std::string()); |
| 1329 | 1186 |
| 1330 // Shutdown sync, delete the Directory, then restart, restoring the cached | 1187 // Shutdown sync, delete the Directory, then restart, restoring the cached |
| 1331 // nigori state. | 1188 // nigori state. |
| 1332 ShutdownImpl(syncer::DISABLE_SYNC); | 1189 ShutdownImpl(syncer::DISABLE_SYNC); |
| 1333 startup_controller_->TryStart(); | 1190 startup_controller_->TryStart(); |
| 1334 UMA_HISTOGRAM_ENUMERATION(kClearServerDataEventsHistogramName, | 1191 UMA_HISTOGRAM_ENUMERATION("Sync.ClearServerDataEvents", |
| 1335 CLEAR_SERVER_DATA_SUCCEEDED, CLEAR_SERVER_DATA_MAX); | 1192 syncer::CLEAR_SERVER_DATA_SUCCEEDED, |
| 1193 syncer::CLEAR_SERVER_DATA_MAX); |
| 1336 } | 1194 } |
| 1337 | 1195 |
| 1338 void ProfileSyncService::OnConfigureDone( | 1196 void ProfileSyncService::OnConfigureDone( |
| 1339 const DataTypeManager::ConfigureResult& result) { | 1197 const DataTypeManager::ConfigureResult& result) { |
| 1340 DCHECK(thread_checker_.CalledOnValidThread()); | 1198 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1341 configure_status_ = result.status; | 1199 configure_status_ = result.status; |
| 1342 data_type_status_table_ = result.data_type_status_table; | 1200 data_type_status_table_ = result.data_type_status_table; |
| 1343 | 1201 |
| 1344 // We should have cleared our cached passphrase before we get here (in | 1202 // We should have cleared our cached passphrase before we get here (in |
| 1345 // OnEngineInitialized()). | 1203 // OnEngineInitialized()). |
| 1346 DCHECK(cached_passphrase_.empty()); | 1204 DCHECK(crypto_->cached_passphrase().empty()); |
| 1347 | 1205 |
| 1348 if (!sync_configure_start_time_.is_null()) { | 1206 if (!sync_configure_start_time_.is_null()) { |
| 1349 if (configure_status_ == DataTypeManager::OK) { | 1207 if (configure_status_ == DataTypeManager::OK) { |
| 1350 base::Time sync_configure_stop_time = base::Time::Now(); | 1208 base::Time sync_configure_stop_time = base::Time::Now(); |
| 1351 base::TimeDelta delta = | 1209 base::TimeDelta delta = |
| 1352 sync_configure_stop_time - sync_configure_start_time_; | 1210 sync_configure_stop_time - sync_configure_start_time_; |
| 1353 if (is_first_time_sync_configure_) { | 1211 if (is_first_time_sync_configure_) { |
| 1354 UMA_HISTOGRAM_LONG_TIMES("Sync.ServiceInitialConfigureTime", delta); | 1212 UMA_HISTOGRAM_LONG_TIMES("Sync.ServiceInitialConfigureTime", delta); |
| 1355 } else { | 1213 } else { |
| 1356 UMA_HISTOGRAM_LONG_TIMES("Sync.ServiceSubsequentConfigureTime", delta); | 1214 UMA_HISTOGRAM_LONG_TIMES("Sync.ServiceSubsequentConfigureTime", delta); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 1375 expect_sync_configuration_aborted_) { | 1233 expect_sync_configuration_aborted_) { |
| 1376 DVLOG(0) << "ProfileSyncService::Observe Sync Configure aborted"; | 1234 DVLOG(0) << "ProfileSyncService::Observe Sync Configure aborted"; |
| 1377 expect_sync_configuration_aborted_ = false; | 1235 expect_sync_configuration_aborted_ = false; |
| 1378 return; | 1236 return; |
| 1379 } | 1237 } |
| 1380 | 1238 |
| 1381 // Handle unrecoverable error. | 1239 // Handle unrecoverable error. |
| 1382 if (configure_status_ != DataTypeManager::OK) { | 1240 if (configure_status_ != DataTypeManager::OK) { |
| 1383 if (result.was_catch_up_configure) { | 1241 if (result.was_catch_up_configure) { |
| 1384 // Record catchup configuration failure. | 1242 // Record catchup configuration failure. |
| 1385 UMA_HISTOGRAM_ENUMERATION(kClearServerDataEventsHistogramName, | 1243 UMA_HISTOGRAM_ENUMERATION("Sync.ClearServerDataEvents", |
| 1386 CLEAR_SERVER_DATA_CATCHUP_FAILED, | 1244 syncer::CLEAR_SERVER_DATA_CATCHUP_FAILED, |
| 1387 CLEAR_SERVER_DATA_MAX); | 1245 syncer::CLEAR_SERVER_DATA_MAX); |
| 1388 } | 1246 } |
| 1389 // Something catastrophic had happened. We should only have one | 1247 // Something catastrophic had happened. We should only have one |
| 1390 // error representing it. | 1248 // error representing it. |
| 1391 syncer::SyncError error = data_type_status_table_.GetUnrecoverableError(); | 1249 syncer::SyncError error = data_type_status_table_.GetUnrecoverableError(); |
| 1392 DCHECK(error.IsSet()); | 1250 DCHECK(error.IsSet()); |
| 1393 std::string message = | 1251 std::string message = |
| 1394 "Sync configuration failed with status " + | 1252 "Sync configuration failed with status " + |
| 1395 DataTypeManager::ConfigureStatusToString(configure_status_) + | 1253 DataTypeManager::ConfigureStatusToString(configure_status_) + |
| 1396 " caused by " + | 1254 " caused by " + |
| 1397 syncer::ModelTypeSetToString( | 1255 syncer::ModelTypeSetToString( |
| 1398 data_type_status_table_.GetUnrecoverableErrorTypes()) + | 1256 data_type_status_table_.GetUnrecoverableErrorTypes()) + |
| 1399 ": " + error.message(); | 1257 ": " + error.message(); |
| 1400 LOG(ERROR) << "ProfileSyncService error: " << message; | 1258 LOG(ERROR) << "ProfileSyncService error: " << message; |
| 1401 OnInternalUnrecoverableError(error.location(), message, true, | 1259 OnInternalUnrecoverableError(error.location(), message, true, |
| 1402 ERROR_REASON_CONFIGURATION_FAILURE); | 1260 ERROR_REASON_CONFIGURATION_FAILURE); |
| 1403 return; | 1261 return; |
| 1404 } | 1262 } |
| 1405 | 1263 |
| 1406 DCHECK_EQ(DataTypeManager::OK, configure_status_); | 1264 DCHECK_EQ(DataTypeManager::OK, configure_status_); |
| 1407 | 1265 |
| 1408 // We should never get in a state where we have no encrypted datatypes | 1266 // We should never get in a state where we have no encrypted datatypes |
| 1409 // enabled, and yet we still think we require a passphrase for decryption. | 1267 // enabled, and yet we still think we require a passphrase for decryption. |
| 1410 DCHECK( | 1268 DCHECK( |
| 1411 !(IsPassphraseRequiredForDecryption() && !IsEncryptedDatatypeEnabled())); | 1269 !(IsPassphraseRequiredForDecryption() && !IsEncryptedDatatypeEnabled())); |
| 1412 | 1270 |
| 1413 // This must be done before we start syncing with the server to avoid | 1271 // This must be done before we start syncing with the server to avoid |
| 1414 // sending unencrypted data up on a first time sync. | 1272 // sending unencrypted data up on a first time sync. |
| 1415 if (encryption_pending_) | 1273 if (crypto_->encryption_pending()) |
| 1416 engine_->EnableEncryptEverything(); | 1274 engine_->EnableEncryptEverything(); |
| 1417 NotifyObservers(); | 1275 NotifyObservers(); |
| 1418 | 1276 |
| 1419 if (migrator_.get() && migrator_->state() != BackendMigrator::IDLE) { | 1277 if (migrator_.get() && migrator_->state() != BackendMigrator::IDLE) { |
| 1420 // Migration in progress. Let the migrator know we just finished | 1278 // Migration in progress. Let the migrator know we just finished |
| 1421 // configuring something. It will be up to the migrator to call | 1279 // configuring something. It will be up to the migrator to call |
| 1422 // StartSyncingWithServer() if migration is now finished. | 1280 // StartSyncingWithServer() if migration is now finished. |
| 1423 migrator_->OnConfigureDone(result); | 1281 migrator_->OnConfigureDone(result); |
| 1424 return; | 1282 return; |
| 1425 } | 1283 } |
| (...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1591 return current_experiments_; | 1449 return current_experiments_; |
| 1592 } | 1450 } |
| 1593 | 1451 |
| 1594 bool ProfileSyncService::HasUnrecoverableError() const { | 1452 bool ProfileSyncService::HasUnrecoverableError() const { |
| 1595 DCHECK(thread_checker_.CalledOnValidThread()); | 1453 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1596 return unrecoverable_error_reason_ != ERROR_REASON_UNSET; | 1454 return unrecoverable_error_reason_ != ERROR_REASON_UNSET; |
| 1597 } | 1455 } |
| 1598 | 1456 |
| 1599 bool ProfileSyncService::IsPassphraseRequired() const { | 1457 bool ProfileSyncService::IsPassphraseRequired() const { |
| 1600 DCHECK(thread_checker_.CalledOnValidThread()); | 1458 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1601 return passphrase_required_reason_ != syncer::REASON_PASSPHRASE_NOT_REQUIRED; | 1459 return crypto_->passphrase_required_reason() != |
| 1460 syncer::REASON_PASSPHRASE_NOT_REQUIRED; |
| 1602 } | 1461 } |
| 1603 | 1462 |
| 1604 bool ProfileSyncService::IsPassphraseRequiredForDecryption() const { | 1463 bool ProfileSyncService::IsPassphraseRequiredForDecryption() const { |
| 1605 DCHECK(thread_checker_.CalledOnValidThread()); | 1464 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1606 // If there is an encrypted datatype enabled and we don't have the proper | 1465 // If there is an encrypted datatype enabled and we don't have the proper |
| 1607 // passphrase, we must prompt the user for a passphrase. The only way for the | 1466 // passphrase, we must prompt the user for a passphrase. The only way for the |
| 1608 // user to avoid entering their passphrase is to disable the encrypted types. | 1467 // user to avoid entering their passphrase is to disable the encrypted types. |
| 1609 return IsEncryptedDatatypeEnabled() && IsPassphraseRequired(); | 1468 return IsEncryptedDatatypeEnabled() && IsPassphraseRequired(); |
| 1610 } | 1469 } |
| 1611 | 1470 |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1764 for (DataTypeController::TypeMap::const_iterator it = | 1623 for (DataTypeController::TypeMap::const_iterator it = |
| 1765 data_type_controllers_.begin(); | 1624 data_type_controllers_.begin(); |
| 1766 it != data_type_controllers_.end(); ++it) { | 1625 it != data_type_controllers_.end(); ++it) { |
| 1767 registered_types.Put(it->first); | 1626 registered_types.Put(it->first); |
| 1768 } | 1627 } |
| 1769 return registered_types; | 1628 return registered_types; |
| 1770 } | 1629 } |
| 1771 | 1630 |
| 1772 bool ProfileSyncService::IsUsingSecondaryPassphrase() const { | 1631 bool ProfileSyncService::IsUsingSecondaryPassphrase() const { |
| 1773 DCHECK(thread_checker_.CalledOnValidThread()); | 1632 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1774 syncer::PassphraseType passphrase_type = GetPassphraseType(); | 1633 return crypto_->IsUsingSecondaryPassphrase(); |
| 1775 return passphrase_type == | |
| 1776 syncer::PassphraseType::FROZEN_IMPLICIT_PASSPHRASE || | |
| 1777 passphrase_type == syncer::PassphraseType::CUSTOM_PASSPHRASE; | |
| 1778 } | 1634 } |
| 1779 | 1635 |
| 1780 std::string ProfileSyncService::GetCustomPassphraseKey() const { | 1636 std::string ProfileSyncService::GetCustomPassphraseKey() const { |
| 1781 DCHECK(thread_checker_.CalledOnValidThread()); | 1637 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1782 syncer::SystemEncryptor encryptor; | 1638 syncer::SystemEncryptor encryptor; |
| 1783 syncer::Cryptographer cryptographer(&encryptor); | 1639 syncer::Cryptographer cryptographer(&encryptor); |
| 1784 cryptographer.Bootstrap(sync_prefs_.GetEncryptionBootstrapToken()); | 1640 cryptographer.Bootstrap(sync_prefs_.GetEncryptionBootstrapToken()); |
| 1785 return cryptographer.GetDefaultNigoriKeyData(); | 1641 return cryptographer.GetDefaultNigoriKeyData(); |
| 1786 } | 1642 } |
| 1787 | 1643 |
| 1788 syncer::PassphraseType ProfileSyncService::GetPassphraseType() const { | 1644 syncer::PassphraseType ProfileSyncService::GetPassphraseType() const { |
| 1789 DCHECK(thread_checker_.CalledOnValidThread()); | 1645 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1790 return engine_->GetPassphraseType(); | 1646 return crypto_->GetPassphraseType(); |
| 1791 } | 1647 } |
| 1792 | 1648 |
| 1793 base::Time ProfileSyncService::GetExplicitPassphraseTime() const { | 1649 base::Time ProfileSyncService::GetExplicitPassphraseTime() const { |
| 1794 DCHECK(thread_checker_.CalledOnValidThread()); | 1650 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1795 return engine_->GetExplicitPassphraseTime(); | 1651 return crypto_->GetExplicitPassphraseTime(); |
| 1796 } | 1652 } |
| 1797 | 1653 |
| 1798 bool ProfileSyncService::IsCryptographerReady( | 1654 bool ProfileSyncService::IsCryptographerReady( |
| 1799 const syncer::BaseTransaction* trans) const { | 1655 const syncer::BaseTransaction* trans) const { |
| 1800 DCHECK(thread_checker_.CalledOnValidThread()); | 1656 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1801 return engine_ && engine_->IsCryptographerReady(trans); | 1657 return engine_ && engine_->IsCryptographerReady(trans); |
| 1802 } | 1658 } |
| 1803 | 1659 |
| 1804 void ProfileSyncService::SetPlatformSyncAllowedProvider( | 1660 void ProfileSyncService::SetPlatformSyncAllowedProvider( |
| 1805 const PlatformSyncAllowedProvider& platform_sync_allowed_provider) { | 1661 const PlatformSyncAllowedProvider& platform_sync_allowed_provider) { |
| (...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1994 dtc_iter->second->GetStatusCounters(BindToCurrentThread( | 1850 dtc_iter->second->GetStatusCounters(BindToCurrentThread( |
| 1995 base::Bind(&ProfileSyncService::OnDatatypeStatusCounterUpdated, | 1851 base::Bind(&ProfileSyncService::OnDatatypeStatusCounterUpdated, |
| 1996 base::Unretained(this)))); | 1852 base::Unretained(this)))); |
| 1997 } | 1853 } |
| 1998 | 1854 |
| 1999 result->Append(std::move(type_status)); | 1855 result->Append(std::move(type_status)); |
| 2000 } | 1856 } |
| 2001 return std::move(result); | 1857 return std::move(result); |
| 2002 } | 1858 } |
| 2003 | 1859 |
| 2004 void ProfileSyncService::ConsumeCachedPassphraseIfPossible() { | |
| 2005 // If no cached passphrase, or sync engine hasn't started up yet, just exit. | |
| 2006 // If the engine isn't running yet, OnEngineInitialized() will call this | |
| 2007 // method again after the engine starts up. | |
| 2008 if (cached_passphrase_.empty() || !IsEngineInitialized()) | |
| 2009 return; | |
| 2010 | |
| 2011 // Engine is up and running, so we can consume the cached passphrase. | |
| 2012 std::string passphrase = cached_passphrase_; | |
| 2013 cached_passphrase_.clear(); | |
| 2014 | |
| 2015 // If we need a passphrase to decrypt data, try the cached passphrase. | |
| 2016 if (passphrase_required_reason() == syncer::REASON_DECRYPTION) { | |
| 2017 if (SetDecryptionPassphrase(passphrase)) { | |
| 2018 DVLOG(1) << "Cached passphrase successfully decrypted pending keys"; | |
| 2019 return; | |
| 2020 } | |
| 2021 } | |
| 2022 | |
| 2023 // If we get here, we don't have pending keys (or at least, the passphrase | |
| 2024 // doesn't decrypt them) - just try to re-encrypt using the encryption | |
| 2025 // passphrase. | |
| 2026 if (!IsUsingSecondaryPassphrase()) | |
| 2027 SetEncryptionPassphrase(passphrase, IMPLICIT); | |
| 2028 } | |
| 2029 | |
| 2030 void ProfileSyncService::RequestAccessToken() { | 1860 void ProfileSyncService::RequestAccessToken() { |
| 2031 // Only one active request at a time. | 1861 // Only one active request at a time. |
| 2032 if (access_token_request_ != nullptr) | 1862 if (access_token_request_ != nullptr) |
| 2033 return; | 1863 return; |
| 2034 request_access_token_retry_timer_.Stop(); | 1864 request_access_token_retry_timer_.Stop(); |
| 2035 OAuth2TokenService::ScopeSet oauth2_scopes; | 1865 OAuth2TokenService::ScopeSet oauth2_scopes; |
| 2036 oauth2_scopes.insert(signin_->GetSyncScopeToUse()); | 1866 oauth2_scopes.insert(signin_->GetSyncScopeToUse()); |
| 2037 | 1867 |
| 2038 // Invalidate previous token, otherwise token service will return the same | 1868 // Invalidate previous token, otherwise token service will return the same |
| 2039 // token again. | 1869 // token again. |
| 2040 const std::string& account_id = signin_->GetAccountIdToUse(); | 1870 const std::string& account_id = signin_->GetAccountIdToUse(); |
| 2041 if (!access_token_.empty()) { | 1871 if (!access_token_.empty()) { |
| 2042 oauth2_token_service_->InvalidateAccessToken(account_id, oauth2_scopes, | 1872 oauth2_token_service_->InvalidateAccessToken(account_id, oauth2_scopes, |
| 2043 access_token_); | 1873 access_token_); |
| 2044 } | 1874 } |
| 2045 | 1875 |
| 2046 access_token_.clear(); | 1876 access_token_.clear(); |
| 2047 | 1877 |
| 2048 token_request_time_ = base::Time::Now(); | 1878 token_request_time_ = base::Time::Now(); |
| 2049 token_receive_time_ = base::Time(); | 1879 token_receive_time_ = base::Time(); |
| 2050 next_token_request_time_ = base::Time(); | 1880 next_token_request_time_ = base::Time(); |
| 2051 access_token_request_ = | 1881 access_token_request_ = |
| 2052 oauth2_token_service_->StartRequest(account_id, oauth2_scopes, this); | 1882 oauth2_token_service_->StartRequest(account_id, oauth2_scopes, this); |
| 2053 } | 1883 } |
| 2054 | 1884 |
| 2055 void ProfileSyncService::SetEncryptionPassphrase(const std::string& passphrase, | 1885 void ProfileSyncService::SetEncryptionPassphrase(const std::string& passphrase, |
| 2056 PassphraseType type) { | 1886 PassphraseType type) { |
| 2057 DCHECK(thread_checker_.CalledOnValidThread()); | 1887 DCHECK(thread_checker_.CalledOnValidThread()); |
| 2058 // This should only be called when the engine has been initialized. | 1888 crypto_->SetEncryptionPassphrase(passphrase, type == EXPLICIT); |
| 2059 DCHECK(IsEngineInitialized()); | |
| 2060 DCHECK(!(type == IMPLICIT && IsUsingSecondaryPassphrase())) | |
| 2061 << "Data is already encrypted using an explicit passphrase"; | |
| 2062 DCHECK(!(type == EXPLICIT && | |
| 2063 passphrase_required_reason_ == syncer::REASON_DECRYPTION)) | |
| 2064 << "Can not set explicit passphrase when decryption is needed."; | |
| 2065 | |
| 2066 DVLOG(1) << "Setting " << (type == EXPLICIT ? "explicit" : "implicit") | |
| 2067 << " passphrase for encryption."; | |
| 2068 if (passphrase_required_reason_ == syncer::REASON_ENCRYPTION) { | |
| 2069 // REASON_ENCRYPTION implies that the cryptographer does not have pending | |
| 2070 // keys. Hence, as long as we're not trying to do an invalid passphrase | |
| 2071 // change (e.g. explicit -> explicit or explicit -> implicit), we know this | |
| 2072 // will succeed. If for some reason a new encryption key arrives via | |
| 2073 // sync later, the SBH will trigger another OnPassphraseRequired(). | |
| 2074 passphrase_required_reason_ = syncer::REASON_PASSPHRASE_NOT_REQUIRED; | |
| 2075 NotifyObservers(); | |
| 2076 } | |
| 2077 engine_->SetEncryptionPassphrase(passphrase, type == EXPLICIT); | |
| 2078 } | 1889 } |
| 2079 | 1890 |
| 2080 bool ProfileSyncService::SetDecryptionPassphrase( | 1891 bool ProfileSyncService::SetDecryptionPassphrase( |
| 2081 const std::string& passphrase) { | 1892 const std::string& passphrase) { |
| 2082 DCHECK(thread_checker_.CalledOnValidThread()); | 1893 DCHECK(thread_checker_.CalledOnValidThread()); |
| 2083 if (IsPassphraseRequired()) { | 1894 if (IsPassphraseRequired()) { |
| 2084 DVLOG(1) << "Setting passphrase for decryption."; | 1895 DVLOG(1) << "Setting passphrase for decryption."; |
| 2085 bool result = engine_->SetDecryptionPassphrase(passphrase); | 1896 bool result = crypto_->SetDecryptionPassphrase(passphrase); |
| 2086 UMA_HISTOGRAM_BOOLEAN("Sync.PassphraseDecryptionSucceeded", result); | 1897 UMA_HISTOGRAM_BOOLEAN("Sync.PassphraseDecryptionSucceeded", result); |
| 2087 return result; | 1898 return result; |
| 2088 } else { | 1899 } else { |
| 2089 NOTREACHED() << "SetDecryptionPassphrase must not be called when " | 1900 NOTREACHED() << "SetDecryptionPassphrase must not be called when " |
| 2090 "IsPassphraseRequired() is false."; | 1901 "IsPassphraseRequired() is false."; |
| 2091 return false; | 1902 return false; |
| 2092 } | 1903 } |
| 2093 } | 1904 } |
| 2094 | 1905 |
| 2095 bool ProfileSyncService::IsEncryptEverythingAllowed() const { | 1906 bool ProfileSyncService::IsEncryptEverythingAllowed() const { |
| 2096 DCHECK(thread_checker_.CalledOnValidThread()); | 1907 DCHECK(thread_checker_.CalledOnValidThread()); |
| 2097 return encrypt_everything_allowed_; | 1908 return crypto_->IsEncryptEverythingAllowed(); |
| 2098 } | 1909 } |
| 2099 | 1910 |
| 2100 void ProfileSyncService::SetEncryptEverythingAllowed(bool allowed) { | 1911 void ProfileSyncService::SetEncryptEverythingAllowed(bool allowed) { |
| 2101 DCHECK(thread_checker_.CalledOnValidThread()); | 1912 DCHECK(thread_checker_.CalledOnValidThread()); |
| 2102 DCHECK(allowed || !IsEngineInitialized() || !IsEncryptEverythingEnabled()); | 1913 crypto_->SetEncryptEverythingAllowed(allowed); |
| 2103 encrypt_everything_allowed_ = allowed; | |
| 2104 } | 1914 } |
| 2105 | 1915 |
| 2106 void ProfileSyncService::EnableEncryptEverything() { | 1916 void ProfileSyncService::EnableEncryptEverything() { |
| 2107 DCHECK(thread_checker_.CalledOnValidThread()); | 1917 DCHECK(thread_checker_.CalledOnValidThread()); |
| 2108 DCHECK(IsEncryptEverythingAllowed()); | 1918 crypto_->EnableEncryptEverything(); |
| 2109 | |
| 2110 // Tests override IsEngineInitialized() to always return true, so we | |
| 2111 // must check that instead of |engine_initialized_|. | |
| 2112 // TODO(akalin): Fix the above. :/ | |
| 2113 DCHECK(IsEngineInitialized()); | |
| 2114 // TODO(atwilson): Persist the encryption_pending_ flag to address the various | |
| 2115 // problems around cancelling encryption in the background (crbug.com/119649). | |
| 2116 if (!encrypt_everything_) | |
| 2117 encryption_pending_ = true; | |
| 2118 } | 1919 } |
| 2119 | 1920 |
| 2120 bool ProfileSyncService::encryption_pending() const { | 1921 bool ProfileSyncService::encryption_pending() const { |
| 2121 DCHECK(thread_checker_.CalledOnValidThread()); | 1922 DCHECK(thread_checker_.CalledOnValidThread()); |
| 2122 // We may be called during the setup process before we're | 1923 // We may be called during the setup process before we're |
| 2123 // initialized (via IsEncryptedDatatypeEnabled and | 1924 // initialized (via IsEncryptedDatatypeEnabled and |
| 2124 // IsPassphraseRequiredForDecryption). | 1925 // IsPassphraseRequiredForDecryption). |
| 2125 return encryption_pending_; | 1926 return crypto_->encryption_pending(); |
| 2126 } | 1927 } |
| 2127 | 1928 |
| 2128 bool ProfileSyncService::IsEncryptEverythingEnabled() const { | 1929 bool ProfileSyncService::IsEncryptEverythingEnabled() const { |
| 2129 DCHECK(thread_checker_.CalledOnValidThread()); | 1930 DCHECK(thread_checker_.CalledOnValidThread()); |
| 2130 DCHECK(engine_initialized_); | 1931 return crypto_->IsEncryptEverythingEnabled(); |
| 2131 return encrypt_everything_ || encryption_pending_; | |
| 2132 } | 1932 } |
| 2133 | 1933 |
| 2134 syncer::ModelTypeSet ProfileSyncService::GetEncryptedDataTypes() const { | 1934 syncer::ModelTypeSet ProfileSyncService::GetEncryptedDataTypes() const { |
| 2135 DCHECK(thread_checker_.CalledOnValidThread()); | 1935 DCHECK(thread_checker_.CalledOnValidThread()); |
| 2136 DCHECK(encrypted_types_.Has(syncer::PASSWORDS)); | 1936 return crypto_->GetEncryptedDataTypes(); |
| 2137 // We may be called during the setup process before we're | |
| 2138 // initialized. In this case, we default to the sensitive types. | |
| 2139 return encrypted_types_; | |
| 2140 } | 1937 } |
| 2141 | 1938 |
| 2142 void ProfileSyncService::OnSyncManagedPrefChange(bool is_sync_managed) { | 1939 void ProfileSyncService::OnSyncManagedPrefChange(bool is_sync_managed) { |
| 2143 DCHECK(thread_checker_.CalledOnValidThread()); | 1940 DCHECK(thread_checker_.CalledOnValidThread()); |
| 2144 if (is_sync_managed) { | 1941 if (is_sync_managed) { |
| 2145 StopImpl(CLEAR_DATA); | 1942 StopImpl(CLEAR_DATA); |
| 2146 } else { | 1943 } else { |
| 2147 // Sync is no longer disabled by policy. Try starting it up if appropriate. | 1944 // Sync is no longer disabled by policy. Try starting it up if appropriate. |
| 2148 startup_controller_->TryStart(); | 1945 startup_controller_->TryStart(); |
| 2149 } | 1946 } |
| 2150 } | 1947 } |
| 2151 | 1948 |
| 2152 void ProfileSyncService::GoogleSigninSucceeded(const std::string& account_id, | 1949 void ProfileSyncService::GoogleSigninSucceeded(const std::string& account_id, |
| 2153 const std::string& username, | 1950 const std::string& username, |
| 2154 const std::string& password) { | 1951 const std::string& password) { |
| 2155 DCHECK(thread_checker_.CalledOnValidThread()); | 1952 DCHECK(thread_checker_.CalledOnValidThread()); |
| 2156 if (IsSyncRequested() && !password.empty()) { | 1953 if (IsSyncRequested() && !password.empty()) { |
| 2157 cached_passphrase_ = password; | 1954 crypto_->CachePassphrase(password); |
| 2158 // Try to consume the passphrase we just cached. If the sync engine | 1955 // Try to consume the passphrase we just cached. If the sync engine |
| 2159 // is not running yet, the passphrase will remain cached until the | 1956 // is not running yet, the passphrase will remain cached until the |
| 2160 // engine starts up. | 1957 // engine starts up. |
| 2161 ConsumeCachedPassphraseIfPossible(); | 1958 crypto_->ConsumeCachedPassphraseIfPossible(); |
| 2162 } | 1959 } |
| 2163 #if defined(OS_CHROMEOS) | 1960 #if defined(OS_CHROMEOS) |
| 2164 RefreshSpareBootstrapToken(password); | 1961 RefreshSpareBootstrapToken(password); |
| 2165 #endif | 1962 #endif |
| 2166 if (!IsEngineInitialized() || GetAuthError().state() != AuthError::NONE) { | 1963 if (!IsEngineInitialized() || GetAuthError().state() != AuthError::NONE) { |
| 2167 // Track the fact that we're still waiting for auth to complete. | 1964 // Track the fact that we're still waiting for auth to complete. |
| 2168 is_auth_in_progress_ = true; | 1965 is_auth_in_progress_ = true; |
| 2169 } | 1966 } |
| 2170 } | 1967 } |
| 2171 | 1968 |
| (...skipping 24 matching lines...) Expand all Loading... |
| 2196 cookie_jar_mismatch = false; | 1993 cookie_jar_mismatch = false; |
| 2197 break; | 1994 break; |
| 2198 } | 1995 } |
| 2199 } | 1996 } |
| 2200 | 1997 |
| 2201 DVLOG(1) << "Cookie jar mismatch: " << cookie_jar_mismatch; | 1998 DVLOG(1) << "Cookie jar mismatch: " << cookie_jar_mismatch; |
| 2202 DVLOG(1) << "Cookie jar empty: " << cookie_jar_empty; | 1999 DVLOG(1) << "Cookie jar empty: " << cookie_jar_empty; |
| 2203 engine_->OnCookieJarChanged(cookie_jar_mismatch, cookie_jar_empty); | 2000 engine_->OnCookieJarChanged(cookie_jar_mismatch, cookie_jar_empty); |
| 2204 } | 2001 } |
| 2205 | 2002 |
| 2206 void ProfileSyncService::AddObserver(syncer::SyncServiceObserver* observer) { | |
| 2207 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 2208 observers_.AddObserver(observer); | |
| 2209 } | |
| 2210 | |
| 2211 void ProfileSyncService::RemoveObserver(syncer::SyncServiceObserver* observer) { | |
| 2212 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 2213 observers_.RemoveObserver(observer); | |
| 2214 } | |
| 2215 | |
| 2216 void ProfileSyncService::AddProtocolEventObserver( | 2003 void ProfileSyncService::AddProtocolEventObserver( |
| 2217 ProtocolEventObserver* observer) { | 2004 ProtocolEventObserver* observer) { |
| 2218 DCHECK(thread_checker_.CalledOnValidThread()); | 2005 DCHECK(thread_checker_.CalledOnValidThread()); |
| 2219 protocol_event_observers_.AddObserver(observer); | 2006 protocol_event_observers_.AddObserver(observer); |
| 2220 if (HasSyncingEngine()) { | 2007 if (HasSyncingEngine()) { |
| 2221 engine_->RequestBufferedProtocolEventsAndEnableForwarding(); | 2008 engine_->RequestBufferedProtocolEventsAndEnableForwarding(); |
| 2222 } | 2009 } |
| 2223 } | 2010 } |
| 2224 | 2011 |
| 2225 void ProfileSyncService::RemoveProtocolEventObserver( | 2012 void ProfileSyncService::RemoveProtocolEventObserver( |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2357 } else { | 2144 } else { |
| 2358 // Control Types | 2145 // Control Types |
| 2359 helper->OnReceivedNodesForType( | 2146 helper->OnReceivedNodesForType( |
| 2360 it.Get(), | 2147 it.Get(), |
| 2361 syncer::DirectoryDataTypeController::GetAllNodesForTypeFromDirectory( | 2148 syncer::DirectoryDataTypeController::GetAllNodesForTypeFromDirectory( |
| 2362 it.Get(), GetUserShare()->directory.get())); | 2149 it.Get(), GetUserShare()->directory.get())); |
| 2363 } | 2150 } |
| 2364 } | 2151 } |
| 2365 } | 2152 } |
| 2366 | 2153 |
| 2367 bool ProfileSyncService::HasObserver( | |
| 2368 const syncer::SyncServiceObserver* observer) const { | |
| 2369 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 2370 return observers_.HasObserver(observer); | |
| 2371 } | |
| 2372 | |
| 2373 base::WeakPtr<syncer::JsController> ProfileSyncService::GetJsController() { | 2154 base::WeakPtr<syncer::JsController> ProfileSyncService::GetJsController() { |
| 2374 DCHECK(thread_checker_.CalledOnValidThread()); | 2155 DCHECK(thread_checker_.CalledOnValidThread()); |
| 2375 return sync_js_controller_.AsWeakPtr(); | 2156 return sync_js_controller_.AsWeakPtr(); |
| 2376 } | 2157 } |
| 2377 | 2158 |
| 2378 // static | 2159 // static |
| 2379 void ProfileSyncService::SyncEvent(SyncEventCodes code) { | 2160 void ProfileSyncService::SyncEvent(SyncEventCodes code) { |
| 2380 UMA_HISTOGRAM_ENUMERATION("Sync.EventCodes", code, MAX_SYNC_EVENT_CODE); | 2161 UMA_HISTOGRAM_ENUMERATION("Sync.EventCodes", code, MAX_SYNC_EVENT_CODE); |
| 2381 } | 2162 } |
| 2382 | 2163 |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2547 | 2328 |
| 2548 base::MessageLoop* ProfileSyncService::GetSyncLoopForTest() const { | 2329 base::MessageLoop* ProfileSyncService::GetSyncLoopForTest() const { |
| 2549 DCHECK(thread_checker_.CalledOnValidThread()); | 2330 DCHECK(thread_checker_.CalledOnValidThread()); |
| 2550 if (sync_thread_) { | 2331 if (sync_thread_) { |
| 2551 return sync_thread_->message_loop(); | 2332 return sync_thread_->message_loop(); |
| 2552 } else { | 2333 } else { |
| 2553 return nullptr; | 2334 return nullptr; |
| 2554 } | 2335 } |
| 2555 } | 2336 } |
| 2556 | 2337 |
| 2338 syncer::SyncEncryptionHandler::Observer* |
| 2339 ProfileSyncService::GetEncryptionObserverForTest() const { |
| 2340 return crypto_.get(); |
| 2341 } |
| 2342 |
| 2557 void ProfileSyncService::RefreshTypesForTest(syncer::ModelTypeSet types) { | 2343 void ProfileSyncService::RefreshTypesForTest(syncer::ModelTypeSet types) { |
| 2558 DCHECK(thread_checker_.CalledOnValidThread()); | 2344 DCHECK(thread_checker_.CalledOnValidThread()); |
| 2559 if (engine_initialized_) | 2345 if (engine_initialized_) |
| 2560 engine_->RefreshTypesForTest(types); | 2346 engine_->RefreshTypesForTest(types); |
| 2561 } | 2347 } |
| 2562 | 2348 |
| 2563 void ProfileSyncService::RemoveClientFromServer() const { | 2349 void ProfileSyncService::RemoveClientFromServer() const { |
| 2564 if (!engine_initialized_) | 2350 if (!engine_initialized_) |
| 2565 return; | 2351 return; |
| 2566 const std::string cache_guid = local_device_->GetLocalSyncCacheGUID(); | 2352 const std::string cache_guid = local_device_->GetLocalSyncCacheGUID(); |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2628 | 2414 |
| 2629 DCHECK(startup_controller_->IsSetupInProgress()); | 2415 DCHECK(startup_controller_->IsSetupInProgress()); |
| 2630 startup_controller_->SetSetupInProgress(false); | 2416 startup_controller_->SetSetupInProgress(false); |
| 2631 | 2417 |
| 2632 if (IsEngineInitialized()) | 2418 if (IsEngineInitialized()) |
| 2633 ReconfigureDatatypeManager(); | 2419 ReconfigureDatatypeManager(); |
| 2634 NotifyObservers(); | 2420 NotifyObservers(); |
| 2635 } | 2421 } |
| 2636 | 2422 |
| 2637 } // namespace browser_sync | 2423 } // namespace browser_sync |
| OLD | NEW |