| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/sync/driver/glue/sync_backend_host_impl.h" | 5 #include "components/sync/driver/glue/sync_backend_host_impl.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 99 SDVLOG(1) << "SyncBackendHostImpl::StartSyncingWithServer called."; | 99 SDVLOG(1) << "SyncBackendHostImpl::StartSyncingWithServer called."; |
| 100 | 100 |
| 101 sync_task_runner_->PostTask( | 101 sync_task_runner_->PostTask( |
| 102 FROM_HERE, base::Bind(&SyncBackendHostCore::DoStartSyncing, core_, | 102 FROM_HERE, base::Bind(&SyncBackendHostCore::DoStartSyncing, core_, |
| 103 sync_prefs_->GetLastPollTime())); | 103 sync_prefs_->GetLastPollTime())); |
| 104 } | 104 } |
| 105 | 105 |
| 106 void SyncBackendHostImpl::SetEncryptionPassphrase(const std::string& passphrase, | 106 void SyncBackendHostImpl::SetEncryptionPassphrase(const std::string& passphrase, |
| 107 bool is_explicit) { | 107 bool is_explicit) { |
| 108 DCHECK(thread_checker_.CalledOnValidThread()); | 108 DCHECK(thread_checker_.CalledOnValidThread()); |
| 109 | |
| 110 if (!IsNigoriEnabled()) { | |
| 111 NOTREACHED() << "SetEncryptionPassphrase must never be called when nigori" | |
| 112 " is disabled."; | |
| 113 return; | |
| 114 } | |
| 115 | |
| 116 // We should never be called with an empty passphrase. | |
| 117 DCHECK(!passphrase.empty()); | |
| 118 | |
| 119 // SetEncryptionPassphrase should never be called if we are currently | |
| 120 // encrypted with an explicit passphrase. | |
| 121 DCHECK(cached_passphrase_type_ == PassphraseType::KEYSTORE_PASSPHRASE || | |
| 122 cached_passphrase_type_ == PassphraseType::IMPLICIT_PASSPHRASE); | |
| 123 | |
| 124 // Post an encryption task on the syncer thread. | |
| 125 sync_task_runner_->PostTask( | 109 sync_task_runner_->PostTask( |
| 126 FROM_HERE, base::Bind(&SyncBackendHostCore::DoSetEncryptionPassphrase, | 110 FROM_HERE, base::Bind(&SyncBackendHostCore::DoSetEncryptionPassphrase, |
| 127 core_, passphrase, is_explicit)); | 111 core_, passphrase, is_explicit)); |
| 128 } | 112 } |
| 129 | 113 |
| 130 bool SyncBackendHostImpl::SetDecryptionPassphrase( | 114 void SyncBackendHostImpl::SetDecryptionPassphrase( |
| 131 const std::string& passphrase) { | 115 const std::string& passphrase) { |
| 132 DCHECK(thread_checker_.CalledOnValidThread()); | 116 DCHECK(thread_checker_.CalledOnValidThread()); |
| 133 | |
| 134 if (!IsNigoriEnabled()) { | |
| 135 NOTREACHED() << "SetDecryptionPassphrase must never be called when nigori" | |
| 136 " is disabled."; | |
| 137 return false; | |
| 138 } | |
| 139 | |
| 140 // We should never be called with an empty passphrase. | |
| 141 DCHECK(!passphrase.empty()); | |
| 142 | |
| 143 // This should only be called when we have cached pending keys. | |
| 144 DCHECK(cached_pending_keys_.has_blob()); | |
| 145 | |
| 146 // Check the passphrase that was provided against our local cache of the | |
| 147 // cryptographer's pending keys. If this was unsuccessful, the UI layer can | |
| 148 // immediately call OnPassphraseRequired without showing the user a spinner. | |
| 149 if (!CheckPassphraseAgainstCachedPendingKeys(passphrase)) | |
| 150 return false; | |
| 151 | |
| 152 // Post a decryption task on the syncer thread. | |
| 153 sync_task_runner_->PostTask( | 117 sync_task_runner_->PostTask( |
| 154 FROM_HERE, base::Bind(&SyncBackendHostCore::DoSetDecryptionPassphrase, | 118 FROM_HERE, base::Bind(&SyncBackendHostCore::DoSetDecryptionPassphrase, |
| 155 core_, passphrase)); | 119 core_, passphrase)); |
| 156 | |
| 157 // Since we were able to decrypt the cached pending keys with the passphrase | |
| 158 // provided, we immediately alert the UI layer that the passphrase was | |
| 159 // accepted. This will avoid the situation where a user enters a passphrase, | |
| 160 // clicks OK, immediately reopens the advanced settings dialog, and gets an | |
| 161 // unnecessary prompt for a passphrase. | |
| 162 // Note: It is not guaranteed that the passphrase will be accepted by the | |
| 163 // syncer thread, since we could receive a new nigori node while the task is | |
| 164 // pending. This scenario is a valid race, and SetDecryptionPassphrase can | |
| 165 // trigger a new OnPassphraseRequired if it needs to. | |
| 166 NotifyPassphraseAccepted(); | |
| 167 return true; | |
| 168 } | 120 } |
| 169 | 121 |
| 170 void SyncBackendHostImpl::StopSyncingForShutdown() { | 122 void SyncBackendHostImpl::StopSyncingForShutdown() { |
| 171 DCHECK(thread_checker_.CalledOnValidThread()); | 123 DCHECK(thread_checker_.CalledOnValidThread()); |
| 172 | 124 |
| 173 // Stop getting messages from the sync thread. | 125 // Stop getting messages from the sync thread. |
| 174 weak_ptr_factory_.InvalidateWeakPtrs(); | 126 weak_ptr_factory_.InvalidateWeakPtrs(); |
| 175 // Immediately stop sending messages to the host. | 127 // Immediately stop sending messages to the host. |
| 176 host_ = nullptr; | 128 host_ = nullptr; |
| 177 | 129 |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 260 SyncBackendHostImpl::Status SyncBackendHostImpl::GetDetailedStatus() { | 212 SyncBackendHostImpl::Status SyncBackendHostImpl::GetDetailedStatus() { |
| 261 DCHECK(initialized()); | 213 DCHECK(initialized()); |
| 262 return core_->sync_manager()->GetDetailedStatus(); | 214 return core_->sync_manager()->GetDetailedStatus(); |
| 263 } | 215 } |
| 264 | 216 |
| 265 bool SyncBackendHostImpl::HasUnsyncedItems() const { | 217 bool SyncBackendHostImpl::HasUnsyncedItems() const { |
| 266 DCHECK(initialized()); | 218 DCHECK(initialized()); |
| 267 return core_->sync_manager()->HasUnsyncedItems(); | 219 return core_->sync_manager()->HasUnsyncedItems(); |
| 268 } | 220 } |
| 269 | 221 |
| 270 bool SyncBackendHostImpl::IsNigoriEnabled() const { | |
| 271 return registrar_ && registrar_->IsNigoriEnabled(); | |
| 272 } | |
| 273 | |
| 274 PassphraseType SyncBackendHostImpl::GetPassphraseType() const { | |
| 275 return cached_passphrase_type_; | |
| 276 } | |
| 277 | |
| 278 base::Time SyncBackendHostImpl::GetExplicitPassphraseTime() const { | |
| 279 return cached_explicit_passphrase_time_; | |
| 280 } | |
| 281 | |
| 282 bool SyncBackendHostImpl::IsCryptographerReady( | 222 bool SyncBackendHostImpl::IsCryptographerReady( |
| 283 const BaseTransaction* trans) const { | 223 const BaseTransaction* trans) const { |
| 284 return initialized() && trans->GetCryptographer() && | 224 return initialized() && trans->GetCryptographer() && |
| 285 trans->GetCryptographer()->is_ready(); | 225 trans->GetCryptographer()->is_ready(); |
| 286 } | 226 } |
| 287 | 227 |
| 288 void SyncBackendHostImpl::GetModelSafeRoutingInfo( | 228 void SyncBackendHostImpl::GetModelSafeRoutingInfo( |
| 289 ModelSafeRoutingInfo* out) const { | 229 ModelSafeRoutingInfo* out) const { |
| 290 if (initialized()) { | 230 if (initialized()) { |
| 291 CHECK(registrar_); | 231 CHECK(registrar_); |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 399 host_->OnSyncCycleCompleted(snapshot); | 339 host_->OnSyncCycleCompleted(snapshot); |
| 400 } | 340 } |
| 401 } | 341 } |
| 402 | 342 |
| 403 void SyncBackendHostImpl::RetryConfigurationOnFrontendLoop( | 343 void SyncBackendHostImpl::RetryConfigurationOnFrontendLoop( |
| 404 const base::Closure& retry_callback) { | 344 const base::Closure& retry_callback) { |
| 405 SDVLOG(1) << "Failed to complete configuration, informing of retry."; | 345 SDVLOG(1) << "Failed to complete configuration, informing of retry."; |
| 406 retry_callback.Run(); | 346 retry_callback.Run(); |
| 407 } | 347 } |
| 408 | 348 |
| 409 void SyncBackendHostImpl::PersistEncryptionBootstrapToken( | |
| 410 const std::string& token, | |
| 411 BootstrapTokenType token_type) { | |
| 412 CHECK(sync_prefs_.get()); | |
| 413 if (token_type == PASSPHRASE_BOOTSTRAP_TOKEN) | |
| 414 sync_prefs_->SetEncryptionBootstrapToken(token); | |
| 415 else | |
| 416 sync_prefs_->SetKeystoreEncryptionBootstrapToken(token); | |
| 417 } | |
| 418 | |
| 419 void SyncBackendHostImpl::HandleActionableErrorEventOnFrontendLoop( | 349 void SyncBackendHostImpl::HandleActionableErrorEventOnFrontendLoop( |
| 420 const SyncProtocolError& sync_error) { | 350 const SyncProtocolError& sync_error) { |
| 421 DCHECK(thread_checker_.CalledOnValidThread()); | 351 DCHECK(thread_checker_.CalledOnValidThread()); |
| 422 host_->OnActionableError(sync_error); | 352 host_->OnActionableError(sync_error); |
| 423 } | 353 } |
| 424 | 354 |
| 425 void SyncBackendHostImpl::HandleMigrationRequestedOnFrontendLoop( | 355 void SyncBackendHostImpl::HandleMigrationRequestedOnFrontendLoop( |
| 426 ModelTypeSet types) { | 356 ModelTypeSet types) { |
| 427 DCHECK(thread_checker_.CalledOnValidThread()); | 357 DCHECK(thread_checker_.CalledOnValidThread()); |
| 428 host_->OnMigrationNeededForTypes(types); | 358 host_->OnMigrationNeededForTypes(types); |
| 429 } | 359 } |
| 430 | 360 |
| 431 void SyncBackendHostImpl::OnInvalidatorStateChange(InvalidatorState state) { | 361 void SyncBackendHostImpl::OnInvalidatorStateChange(InvalidatorState state) { |
| 432 sync_task_runner_->PostTask( | 362 sync_task_runner_->PostTask( |
| 433 FROM_HERE, base::Bind(&SyncBackendHostCore::DoOnInvalidatorStateChange, | 363 FROM_HERE, base::Bind(&SyncBackendHostCore::DoOnInvalidatorStateChange, |
| 434 core_, state)); | 364 core_, state)); |
| 435 } | 365 } |
| 436 | 366 |
| 437 void SyncBackendHostImpl::OnIncomingInvalidation( | 367 void SyncBackendHostImpl::OnIncomingInvalidation( |
| 438 const ObjectIdInvalidationMap& invalidation_map) { | 368 const ObjectIdInvalidationMap& invalidation_map) { |
| 439 sync_task_runner_->PostTask( | 369 sync_task_runner_->PostTask( |
| 440 FROM_HERE, base::Bind(&SyncBackendHostCore::DoOnIncomingInvalidation, | 370 FROM_HERE, base::Bind(&SyncBackendHostCore::DoOnIncomingInvalidation, |
| 441 core_, invalidation_map)); | 371 core_, invalidation_map)); |
| 442 } | 372 } |
| 443 | 373 |
| 444 std::string SyncBackendHostImpl::GetOwnerName() const { | 374 std::string SyncBackendHostImpl::GetOwnerName() const { |
| 445 return "SyncBackendHostImpl"; | 375 return "SyncBackendHostImpl"; |
| 446 } | 376 } |
| 447 | 377 |
| 448 bool SyncBackendHostImpl::CheckPassphraseAgainstCachedPendingKeys( | |
| 449 const std::string& passphrase) const { | |
| 450 DCHECK(cached_pending_keys_.has_blob()); | |
| 451 DCHECK(!passphrase.empty()); | |
| 452 Nigori nigori; | |
| 453 nigori.InitByDerivation("localhost", "dummy", passphrase); | |
| 454 std::string plaintext; | |
| 455 bool result = nigori.Decrypt(cached_pending_keys_.blob(), &plaintext); | |
| 456 DVLOG_IF(1, result) << "Passphrase failed to decrypt pending keys."; | |
| 457 return result; | |
| 458 } | |
| 459 | |
| 460 void SyncBackendHostImpl::NotifyPassphraseRequired( | |
| 461 PassphraseRequiredReason reason, | |
| 462 sync_pb::EncryptedData pending_keys) { | |
| 463 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 464 | |
| 465 // Update our cache of the cryptographer's pending keys. | |
| 466 cached_pending_keys_ = pending_keys; | |
| 467 | |
| 468 host_->OnPassphraseRequired(reason, pending_keys); | |
| 469 } | |
| 470 | |
| 471 void SyncBackendHostImpl::NotifyPassphraseAccepted() { | |
| 472 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 473 // Clear our cache of the cryptographer's pending keys. | |
| 474 cached_pending_keys_.clear_blob(); | |
| 475 host_->OnPassphraseAccepted(); | |
| 476 } | |
| 477 | |
| 478 void SyncBackendHostImpl::NotifyEncryptedTypesChanged( | |
| 479 ModelTypeSet encrypted_types, | |
| 480 bool encrypt_everything) { | |
| 481 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 482 host_->OnEncryptedTypesChanged(encrypted_types, encrypt_everything); | |
| 483 } | |
| 484 | |
| 485 void SyncBackendHostImpl::NotifyEncryptionComplete() { | |
| 486 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 487 host_->OnEncryptionComplete(); | |
| 488 } | |
| 489 | |
| 490 void SyncBackendHostImpl::HandlePassphraseTypeChangedOnFrontendLoop( | |
| 491 PassphraseType type, | |
| 492 base::Time explicit_passphrase_time) { | |
| 493 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 494 DVLOG(1) << "Passphrase type changed to " << PassphraseTypeToString(type); | |
| 495 cached_passphrase_type_ = type; | |
| 496 cached_explicit_passphrase_time_ = explicit_passphrase_time; | |
| 497 } | |
| 498 | |
| 499 void SyncBackendHostImpl::HandleLocalSetPassphraseEncryptionOnFrontendLoop( | |
| 500 const SyncEncryptionHandler::NigoriState& nigori_state) { | |
| 501 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 502 host_->OnLocalSetPassphraseEncryption(nigori_state); | |
| 503 } | |
| 504 | |
| 505 void SyncBackendHostImpl::HandleConnectionStatusChangeOnFrontendLoop( | 378 void SyncBackendHostImpl::HandleConnectionStatusChangeOnFrontendLoop( |
| 506 ConnectionStatus status) { | 379 ConnectionStatus status) { |
| 507 DCHECK(thread_checker_.CalledOnValidThread()); | 380 DCHECK(thread_checker_.CalledOnValidThread()); |
| 508 DVLOG(1) << "Connection status changed: " << ConnectionStatusToString(status); | 381 DVLOG(1) << "Connection status changed: " << ConnectionStatusToString(status); |
| 509 host_->OnConnectionStatusChange(status); | 382 host_->OnConnectionStatusChange(status); |
| 510 } | 383 } |
| 511 | 384 |
| 512 void SyncBackendHostImpl::HandleProtocolEventOnFrontendLoop( | 385 void SyncBackendHostImpl::HandleProtocolEventOnFrontendLoop( |
| 513 std::unique_ptr<ProtocolEvent> event) { | 386 std::unique_ptr<ProtocolEvent> event) { |
| 514 DCHECK(thread_checker_.CalledOnValidThread()); | 387 DCHECK(thread_checker_.CalledOnValidThread()); |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 569 const SyncManager::ClearServerDataCallback& frontend_callback) { | 442 const SyncManager::ClearServerDataCallback& frontend_callback) { |
| 570 DCHECK(thread_checker_.CalledOnValidThread()); | 443 DCHECK(thread_checker_.CalledOnValidThread()); |
| 571 frontend_callback.Run(); | 444 frontend_callback.Run(); |
| 572 } | 445 } |
| 573 | 446 |
| 574 } // namespace syncer | 447 } // namespace syncer |
| 575 | 448 |
| 576 #undef SDVLOG | 449 #undef SDVLOG |
| 577 | 450 |
| 578 #undef SLOG | 451 #undef SLOG |
| OLD | NEW |