| Index: sync/internal_api/sync_encryption_handler_impl.cc
|
| diff --git a/sync/internal_api/sync_encryption_handler_impl.cc b/sync/internal_api/sync_encryption_handler_impl.cc
|
| index b9f5ed193d19a49f1598d484f63b0d6edde59b29..c632ba57a595351199c4a2954f5b7a8d969e6941 100644
|
| --- a/sync/internal_api/sync_encryption_handler_impl.cc
|
| +++ b/sync/internal_api/sync_encryption_handler_impl.cc
|
| @@ -40,8 +40,8 @@ static const int kNigoriOverwriteLimit = 10;
|
| SyncEncryptionHandlerImpl::Vault::Vault(
|
| Encryptor* encryptor,
|
| ModelTypeSet encrypted_types)
|
| - : cryptographer(encryptor),
|
| - encrypted_types(encrypted_types) {
|
| + : cryptographer(encryptor),
|
| + encrypted_types(encrypted_types) {
|
| }
|
|
|
| SyncEncryptionHandlerImpl::Vault::~Vault() {
|
| @@ -54,7 +54,7 @@ SyncEncryptionHandlerImpl::SyncEncryptionHandlerImpl(
|
| user_share_(user_share),
|
| vault_unsafe_(encryptor, SensitiveTypes()),
|
| encrypt_everything_(false),
|
| - explicit_passphrase_(false),
|
| + passphrase_state_(IMPLICIT_PASSPHRASE),
|
| nigori_overwrite_count_(0) {
|
| }
|
|
|
| @@ -390,12 +390,9 @@ bool SyncEncryptionHandlerImpl::EncryptEverythingEnabled() const {
|
| return encrypt_everything_;
|
| }
|
|
|
| -bool SyncEncryptionHandlerImpl::IsUsingExplicitPassphrase() const {
|
| - // TODO(zea): this is called from the UI thread, so we have to have a
|
| - // transaction while accessing it. Add an OnPassphraseTypeChanged observer
|
| - // and have the SBH cache the value on the UI thread.
|
| - ReadTransaction trans(FROM_HERE, user_share_);
|
| - return explicit_passphrase_;
|
| +PassphraseState SyncEncryptionHandlerImpl::GetPassphraseState() const {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| + return passphrase_state_;
|
| }
|
|
|
| // Note: this is called from within a syncable transaction, so we need to post
|
| @@ -517,10 +514,15 @@ bool SyncEncryptionHandlerImpl::ApplyNigoriUpdateImpl(
|
| const sync_pb::NigoriSpecifics& nigori,
|
| syncable::BaseTransaction* const trans) {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| + DVLOG(1) << "Applying nigori node update.";
|
| bool nigori_types_need_update = !UpdateEncryptedTypesFromNigori(nigori,
|
| trans);
|
| - if (nigori.using_explicit_passphrase())
|
| - explicit_passphrase_ = true;
|
| + if (nigori.using_explicit_passphrase() &&
|
| + passphrase_state_ != CUSTOM_PASSPHRASE) {
|
| + passphrase_state_ = CUSTOM_PASSPHRASE;
|
| + FOR_EACH_OBSERVER(SyncEncryptionHandler::Observer, observers_,
|
| + OnPassphraseStateChanged(passphrase_state_));
|
| + }
|
|
|
| Cryptographer* cryptographer = &UnlockVaultMutable(trans)->cryptographer;
|
| bool nigori_needs_new_keys = false;
|
| @@ -567,7 +569,8 @@ bool SyncEncryptionHandlerImpl::ApplyNigoriUpdateImpl(
|
| // Check if the current local encryption state is stricter/newer than the
|
| // nigori state. If so, we need to overwrite the nigori node with the local
|
| // state.
|
| - if (nigori.using_explicit_passphrase() != explicit_passphrase_ ||
|
| + bool explicit_passphrase = passphrase_state_ == CUSTOM_PASSPHRASE;
|
| + if (nigori.using_explicit_passphrase() != explicit_passphrase ||
|
| nigori.encrypt_everything() != encrypt_everything_ ||
|
| nigori_types_need_update ||
|
| nigori_needs_new_keys) {
|
| @@ -683,7 +686,7 @@ void SyncEncryptionHandlerImpl::FinishSetPassphrase(
|
| // set the passphrase (for example if we need to preserve the new GAIA
|
| // passphrase).
|
| if (!bootstrap_token.empty()) {
|
| - DVLOG(1) << "Bootstrap token updated.";
|
| + DVLOG(1) << "Passphrase bootstrap token updated.";
|
| FOR_EACH_OBSERVER(SyncEncryptionHandler::Observer, observers_,
|
| OnBootstrapTokenUpdated(bootstrap_token));
|
| }
|
| @@ -706,8 +709,6 @@ void SyncEncryptionHandlerImpl::FinishSetPassphrase(
|
| return;
|
| }
|
|
|
| - FOR_EACH_OBSERVER(SyncEncryptionHandler::Observer, observers_,
|
| - OnPassphraseAccepted());
|
| DCHECK(cryptographer.is_ready());
|
|
|
| sync_pb::NigoriSpecifics specifics(nigori_node->GetNigoriSpecifics());
|
| @@ -715,10 +716,19 @@ void SyncEncryptionHandlerImpl::FinishSetPassphrase(
|
| // the same.
|
| if (!cryptographer.GetKeys(specifics.mutable_encrypted()))
|
| NOTREACHED();
|
| - explicit_passphrase_ = is_explicit;
|
| + if (is_explicit && passphrase_state_ != CUSTOM_PASSPHRASE) {
|
| + passphrase_state_ = CUSTOM_PASSPHRASE;
|
| + FOR_EACH_OBSERVER(SyncEncryptionHandler::Observer, observers_,
|
| + OnPassphraseStateChanged(passphrase_state_));
|
| + }
|
| specifics.set_using_explicit_passphrase(is_explicit);
|
| nigori_node->SetNigoriSpecifics(specifics);
|
|
|
| + // Must do this after OnPassphraseStateChanged, in order to ensure the PSS
|
| + // checks the passphrase state after it has been set.
|
| + FOR_EACH_OBSERVER(SyncEncryptionHandler::Observer, observers_,
|
| + OnPassphraseAccepted());
|
| +
|
| // Does nothing if everything is already encrypted.
|
| ReEncryptEverything(trans);
|
| }
|
|
|