Chromium Code Reviews| 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 "sync/internal_api/sync_encryption_handler_impl.h" | 5 #include "sync/internal_api/sync_encryption_handler_impl.h" |
| 6 | 6 |
| 7 #include <queue> | 7 #include <queue> |
| 8 #include <string> | 8 #include <string> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 53 SyncEncryptionHandlerImpl::SyncEncryptionHandlerImpl( | 53 SyncEncryptionHandlerImpl::SyncEncryptionHandlerImpl( |
| 54 UserShare* user_share, | 54 UserShare* user_share, |
| 55 Encryptor* encryptor) | 55 Encryptor* encryptor) |
| 56 : weak_ptr_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), | 56 : weak_ptr_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), |
| 57 user_share_(user_share), | 57 user_share_(user_share), |
| 58 cryptographer_unsafe_(encryptor), | 58 cryptographer_unsafe_(encryptor), |
| 59 encrypted_types_unsafe_(SensitiveTypes()), | 59 encrypted_types_unsafe_(SensitiveTypes()), |
| 60 cryptographer_holder_(user_share_, &cryptographer_unsafe_), | 60 cryptographer_holder_(user_share_, &cryptographer_unsafe_), |
| 61 encrypted_types_holder_(user_share_, &encrypted_types_unsafe_), | 61 encrypted_types_holder_(user_share_, &encrypted_types_unsafe_), |
| 62 encrypt_everything_(false), | 62 encrypt_everything_(false), |
| 63 explicit_passphrase_(false), | 63 passphrase_state_(IMPLICIT_PASSPHRASE), |
| 64 nigori_overwrite_count_(0) { | 64 nigori_overwrite_count_(0) { |
| 65 } | 65 } |
| 66 | 66 |
| 67 SyncEncryptionHandlerImpl::~SyncEncryptionHandlerImpl() {} | 67 SyncEncryptionHandlerImpl::~SyncEncryptionHandlerImpl() {} |
| 68 | 68 |
| 69 void SyncEncryptionHandlerImpl::AddObserver(Observer* observer) { | 69 void SyncEncryptionHandlerImpl::AddObserver(Observer* observer) { |
| 70 DCHECK(thread_checker_.CalledOnValidThread()); | 70 DCHECK(thread_checker_.CalledOnValidThread()); |
| 71 DCHECK(!observers_.HasObserver(observer)); | 71 DCHECK(!observers_.HasObserver(observer)); |
| 72 observers_.AddObserver(observer); | 72 observers_.AddObserver(observer); |
| 73 } | 73 } |
| (...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 382 WriteEncryptionStateToNigori(&trans); | 382 WriteEncryptionStateToNigori(&trans); |
| 383 if (cryptographer_holder_.Get(trans.GetWrappedTrans()).is_ready()) | 383 if (cryptographer_holder_.Get(trans.GetWrappedTrans()).is_ready()) |
| 384 ReEncryptEverything(&trans); | 384 ReEncryptEverything(&trans); |
| 385 } | 385 } |
| 386 | 386 |
| 387 bool SyncEncryptionHandlerImpl::EncryptEverythingEnabled() const { | 387 bool SyncEncryptionHandlerImpl::EncryptEverythingEnabled() const { |
| 388 DCHECK(thread_checker_.CalledOnValidThread()); | 388 DCHECK(thread_checker_.CalledOnValidThread()); |
| 389 return encrypt_everything_; | 389 return encrypt_everything_; |
| 390 } | 390 } |
| 391 | 391 |
| 392 bool SyncEncryptionHandlerImpl::IsUsingExplicitPassphrase() const { | 392 PassphraseState SyncEncryptionHandlerImpl::GetPassphraseState() const { |
| 393 // TODO(zea): this is called from the UI thread, so we have to have a | 393 DCHECK(thread_checker_.CalledOnValidThread()); |
| 394 // transaction while accessing it. Add an OnPassphraseTypeChanged observer | 394 return passphrase_state_; |
| 395 // and have the SBH cache the value on the UI thread. | |
| 396 ReadTransaction trans(FROM_HERE, user_share_); | |
| 397 return explicit_passphrase_; | |
| 398 } | 395 } |
| 399 | 396 |
| 400 // Note: this is called from within a syncable transaction, so we need to post | 397 // Note: this is called from within a syncable transaction, so we need to post |
| 401 // tasks if we want to do any work that creates a new sync_api transaction. | 398 // tasks if we want to do any work that creates a new sync_api transaction. |
| 402 void SyncEncryptionHandlerImpl::ApplyNigoriUpdate( | 399 void SyncEncryptionHandlerImpl::ApplyNigoriUpdate( |
| 403 const sync_pb::NigoriSpecifics& nigori, | 400 const sync_pb::NigoriSpecifics& nigori, |
| 404 syncable::BaseTransaction* const trans) { | 401 syncable::BaseTransaction* const trans) { |
| 405 DCHECK(thread_checker_.CalledOnValidThread()); | 402 DCHECK(thread_checker_.CalledOnValidThread()); |
| 406 DCHECK(trans); | 403 DCHECK(trans); |
| 407 if (!ApplyNigoriUpdateImpl(nigori, trans)) { | 404 if (!ApplyNigoriUpdateImpl(nigori, trans)) { |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 499 | 496 |
| 500 // NOTE: We notify from within a transaction. | 497 // NOTE: We notify from within a transaction. |
| 501 FOR_EACH_OBSERVER(SyncEncryptionHandler::Observer, observers_, | 498 FOR_EACH_OBSERVER(SyncEncryptionHandler::Observer, observers_, |
| 502 OnEncryptionComplete()); | 499 OnEncryptionComplete()); |
| 503 } | 500 } |
| 504 | 501 |
| 505 bool SyncEncryptionHandlerImpl::ApplyNigoriUpdateImpl( | 502 bool SyncEncryptionHandlerImpl::ApplyNigoriUpdateImpl( |
| 506 const sync_pb::NigoriSpecifics& nigori, | 503 const sync_pb::NigoriSpecifics& nigori, |
| 507 syncable::BaseTransaction* const trans) { | 504 syncable::BaseTransaction* const trans) { |
| 508 DCHECK(thread_checker_.CalledOnValidThread()); | 505 DCHECK(thread_checker_.CalledOnValidThread()); |
| 506 DVLOG(1) << "Applying nigori node update."; | |
| 509 bool nigori_types_need_update = !UpdateEncryptedTypesFromNigori(nigori, | 507 bool nigori_types_need_update = !UpdateEncryptedTypesFromNigori(nigori, |
| 510 trans); | 508 trans); |
| 511 if (nigori.using_explicit_passphrase()) | 509 if (nigori.using_explicit_passphrase() && |
| 512 explicit_passphrase_ = true; | 510 passphrase_state_ != CUSTOM_PASSPHRASE) { |
| 511 passphrase_state_ = CUSTOM_PASSPHRASE; | |
| 512 FOR_EACH_OBSERVER(SyncEncryptionHandler::Observer, observers_, | |
| 513 OnPassphraseStateChanged(passphrase_state_)); | |
| 514 } | |
| 513 | 515 |
| 514 Cryptographer* cryptographer = cryptographer_holder_.GetMutable(trans); | 516 Cryptographer* cryptographer = cryptographer_holder_.GetMutable(trans); |
| 515 bool nigori_needs_new_keys = false; | 517 bool nigori_needs_new_keys = false; |
| 516 if (!nigori.encrypted().blob().empty()) { | 518 if (!nigori.encrypted().blob().empty()) { |
| 517 if (cryptographer->CanDecrypt(nigori.encrypted())) { | 519 if (cryptographer->CanDecrypt(nigori.encrypted())) { |
| 518 cryptographer->InstallKeys(nigori.encrypted()); | 520 cryptographer->InstallKeys(nigori.encrypted()); |
| 519 // We only update the default passphrase if this was a new explicit | 521 // We only update the default passphrase if this was a new explicit |
| 520 // passphrase. Else, since it was decryptable, it must not have been a new | 522 // passphrase. Else, since it was decryptable, it must not have been a new |
| 521 // key. | 523 // key. |
| 522 if (nigori.using_explicit_passphrase()) | 524 if (nigori.using_explicit_passphrase()) |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 549 DVLOG(1) << "OnPassphraseRequired sent because cryptographer is not " | 551 DVLOG(1) << "OnPassphraseRequired sent because cryptographer is not " |
| 550 << "ready"; | 552 << "ready"; |
| 551 FOR_EACH_OBSERVER(SyncEncryptionHandler::Observer, observers_, | 553 FOR_EACH_OBSERVER(SyncEncryptionHandler::Observer, observers_, |
| 552 OnPassphraseRequired(REASON_ENCRYPTION, | 554 OnPassphraseRequired(REASON_ENCRYPTION, |
| 553 sync_pb::EncryptedData())); | 555 sync_pb::EncryptedData())); |
| 554 } | 556 } |
| 555 | 557 |
| 556 // Check if the current local encryption state is stricter/newer than the | 558 // Check if the current local encryption state is stricter/newer than the |
| 557 // nigori state. If so, we need to overwrite the nigori node with the local | 559 // nigori state. If so, we need to overwrite the nigori node with the local |
| 558 // state. | 560 // state. |
| 559 if (nigori.using_explicit_passphrase() != explicit_passphrase_ || | 561 if (nigori.using_explicit_passphrase() != |
| 562 (passphrase_state_ == CUSTOM_PASSPHRASE) || | |
|
akalin
2012/08/22 20:10:39
might be clearer to have an intermediate variable
Nicolas Zea
2012/08/22 20:18:33
Done.
| |
| 560 nigori.encrypt_everything() != encrypt_everything_ || | 563 nigori.encrypt_everything() != encrypt_everything_ || |
| 561 nigori_types_need_update || | 564 nigori_types_need_update || |
| 562 nigori_needs_new_keys) { | 565 nigori_needs_new_keys) { |
| 563 return false; | 566 return false; |
| 564 } | 567 } |
| 565 return true; | 568 return true; |
| 566 } | 569 } |
| 567 | 570 |
| 568 void SyncEncryptionHandlerImpl::RewriteNigori() { | 571 void SyncEncryptionHandlerImpl::RewriteNigori() { |
| 569 DVLOG(1) << "Overwriting stale nigori node."; | 572 DVLOG(1) << "Overwriting stale nigori node."; |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 688 OnPassphraseRequired(REASON_DECRYPTION, | 691 OnPassphraseRequired(REASON_DECRYPTION, |
| 689 cryptographer.GetPendingKeys())); | 692 cryptographer.GetPendingKeys())); |
| 690 } else { | 693 } else { |
| 691 FOR_EACH_OBSERVER(SyncEncryptionHandler::Observer, observers_, | 694 FOR_EACH_OBSERVER(SyncEncryptionHandler::Observer, observers_, |
| 692 OnPassphraseRequired(REASON_ENCRYPTION, | 695 OnPassphraseRequired(REASON_ENCRYPTION, |
| 693 sync_pb::EncryptedData())); | 696 sync_pb::EncryptedData())); |
| 694 } | 697 } |
| 695 return; | 698 return; |
| 696 } | 699 } |
| 697 | 700 |
| 698 FOR_EACH_OBSERVER(SyncEncryptionHandler::Observer, observers_, | |
| 699 OnPassphraseAccepted()); | |
| 700 DCHECK(cryptographer.is_ready()); | 701 DCHECK(cryptographer.is_ready()); |
| 701 | 702 |
| 702 sync_pb::NigoriSpecifics specifics(nigori_node->GetNigoriSpecifics()); | 703 sync_pb::NigoriSpecifics specifics(nigori_node->GetNigoriSpecifics()); |
| 703 // Does not modify specifics.encrypted() if the original decrypted data was | 704 // Does not modify specifics.encrypted() if the original decrypted data was |
| 704 // the same. | 705 // the same. |
| 705 if (!cryptographer.GetKeys(specifics.mutable_encrypted())) | 706 if (!cryptographer.GetKeys(specifics.mutable_encrypted())) |
| 706 NOTREACHED(); | 707 NOTREACHED(); |
| 707 explicit_passphrase_ = is_explicit; | 708 if (is_explicit && passphrase_state_ != CUSTOM_PASSPHRASE) { |
| 709 passphrase_state_ = CUSTOM_PASSPHRASE; | |
| 710 FOR_EACH_OBSERVER(SyncEncryptionHandler::Observer, observers_, | |
| 711 OnPassphraseStateChanged(passphrase_state_)); | |
| 712 } | |
| 708 specifics.set_using_explicit_passphrase(is_explicit); | 713 specifics.set_using_explicit_passphrase(is_explicit); |
| 709 nigori_node->SetNigoriSpecifics(specifics); | 714 nigori_node->SetNigoriSpecifics(specifics); |
| 710 | 715 |
| 716 // Must do this after OnPassphraseStateChanged, in order to ensure the PSS | |
| 717 // checks the passphrase state after it has been set. | |
| 718 FOR_EACH_OBSERVER(SyncEncryptionHandler::Observer, observers_, | |
| 719 OnPassphraseAccepted()); | |
| 720 | |
| 711 // Does nothing if everything is already encrypted. | 721 // Does nothing if everything is already encrypted. |
| 712 ReEncryptEverything(trans); | 722 ReEncryptEverything(trans); |
| 713 } | 723 } |
| 714 | 724 |
| 715 void SyncEncryptionHandlerImpl::MergeEncryptedTypes( | 725 void SyncEncryptionHandlerImpl::MergeEncryptedTypes( |
| 716 ModelTypeSet new_encrypted_types, | 726 ModelTypeSet new_encrypted_types, |
| 717 syncable::BaseTransaction* const trans) { | 727 syncable::BaseTransaction* const trans) { |
| 718 DCHECK(thread_checker_.CalledOnValidThread()); | 728 DCHECK(thread_checker_.CalledOnValidThread()); |
| 719 ModelTypeSet* encrypted_types = encrypted_types_holder_.GetMutable(trans); | 729 ModelTypeSet* encrypted_types = encrypted_types_holder_.GetMutable(trans); |
| 720 if (!encrypted_types->HasAll(new_encrypted_types)) { | 730 if (!encrypted_types->HasAll(new_encrypted_types)) { |
| 721 *encrypted_types = new_encrypted_types; | 731 *encrypted_types = new_encrypted_types; |
| 722 FOR_EACH_OBSERVER( | 732 FOR_EACH_OBSERVER( |
| 723 Observer, observers_, | 733 Observer, observers_, |
| 724 OnEncryptedTypesChanged(*encrypted_types, encrypt_everything_)); | 734 OnEncryptedTypesChanged(*encrypted_types, encrypt_everything_)); |
| 725 } | 735 } |
| 726 } | 736 } |
| 727 | 737 |
| 728 } // namespace browser_sync | 738 } // namespace browser_sync |
| OLD | NEW |