Chromium Code Reviews| Index: chrome/browser/sync/internal_api/sync_manager.cc |
| diff --git a/chrome/browser/sync/internal_api/sync_manager.cc b/chrome/browser/sync/internal_api/sync_manager.cc |
| index c8435b65b996a08fe7dab7efb01fca927e24a726..98ce5d70c16a6c7a93a32ccbd57735efbf605551 100644 |
| --- a/chrome/browser/sync/internal_api/sync_manager.cc |
| +++ b/chrome/browser/sync/internal_api/sync_manager.cc |
| @@ -119,6 +119,7 @@ namespace sync_api { |
| // SyncManager's implementation: SyncManager::SyncInternal |
| class SyncManager::SyncInternal |
| : public net::NetworkChangeNotifier::IPAddressObserver, |
| + public browser_sync::Cryptographer::Observer, |
| public sync_notifier::SyncNotifierObserver, |
| public JsBackend, |
| public SyncEngineEventListener, |
| @@ -259,6 +260,12 @@ class SyncManager::SyncInternal |
| // Open the directory named with username_for_share |
| bool OpenDirectory(); |
| + // Cryptographer::Observer implementation. |
| + virtual void OnEncryptedTypesChanged( |
| + const syncable::ModelTypeSet& encrypted_types, |
| + bool encrypt_everything) OVERRIDE; |
| + virtual void OnEncryptionComplete() OVERRIDE; |
| + |
| // SyncNotifierObserver implementation. |
| virtual void OnNotificationStateChange( |
| bool notifications_enabled) OVERRIDE; |
| @@ -439,15 +446,6 @@ class SyncManager::SyncInternal |
| void ReEncryptEverything(WriteTransaction* trans); |
| - // Initializes (bootstraps) the Cryptographer if NIGORI has finished |
| - // initial sync so that it can immediately start encrypting / decrypting. |
| - // If the restored key is incompatible with the current version of the NIGORI |
| - // node (which could happen if a restart occurred just after an update to |
| - // NIGORI was downloaded and the user must enter a new passphrase to decrypt) |
| - // then we will raise OnPassphraseRequired and set pending keys for |
| - // decryption. Otherwise, the cryptographer is made ready (is_ready()). |
| - void BootstrapEncryption(const std::string& restored_key_for_bootstrapping); |
| - |
| // Called for every notification. This updates the notification statistics |
| // to be displayed in about:sync. |
| void UpdateNotificationInfo( |
| @@ -688,7 +686,7 @@ void SyncManager::EnableEncryptEverything() { |
| data_->EncryptDataTypes(syncable::ModelTypeSet()); |
| } |
| -bool SyncManager::EncryptEverythingEnabled() const { |
| +bool SyncManager::EncryptEverythingEnabledForTest() const { |
| ReadTransaction trans(FROM_HERE, GetUserShare()); |
| return trans.GetCryptographer()->encrypt_everything(); |
| } |
| @@ -810,8 +808,14 @@ bool SyncManager::SyncInternal::Init( |
| initialized_ = true; |
| - // The following calls check that initialized_ is true. |
| - BootstrapEncryption(restored_key_for_bootstrapping); |
| + // The following call checks that initialized_ is true. |
|
Nicolas Zea
2011/10/21 14:29:07
Something like "Getting the user share to open a t
akalin
2011/10/22 03:28:38
Done.
|
| + { |
| + // Cryptographer should only be accessed while holding a |
| + // transaction. |
| + ReadTransaction trans(FROM_HERE, GetUserShare()); |
| + trans.GetCryptographer()->Bootstrap(restored_key_for_bootstrapping); |
| + trans.GetCryptographer()->AddObserver(this); |
| + } |
| } |
| // Notify that initialization is complete. Note: This should be the last to |
| @@ -832,22 +836,12 @@ bool SyncManager::SyncInternal::Init( |
| return signed_in; |
| } |
| -void SyncManager::SyncInternal::BootstrapEncryption( |
| - const std::string& restored_key_for_bootstrapping) { |
| - // Cryptographer should only be accessed while holding a transaction. |
| - ReadTransaction trans(FROM_HERE, GetUserShare()); |
| - Cryptographer* cryptographer = trans.GetCryptographer(); |
| - |
| - // Set the bootstrap token before bailing out if nigori node is not there. |
| - // This could happen if server asked us to migrate nigri. |
| - cryptographer->Bootstrap(restored_key_for_bootstrapping); |
| -} |
| - |
| bool SyncManager::SyncInternal::UpdateCryptographerFromNigori() { |
| DCHECK(initialized_); |
| syncable::ScopedDirLookup lookup(dir_manager(), username_for_share()); |
| if (!lookup.good()) { |
| - NOTREACHED() << "BootstrapEncryption: lookup not good so bailing out"; |
| + NOTREACHED() |
| + << "UpdateCryptographerFromNigori: lookup not good so bailing out"; |
| return false; |
| } |
| if (!lookup->initial_sync_ended_for_type(syncable::NIGORI)) |
| @@ -1139,7 +1133,6 @@ void SyncManager::SyncInternal::EncryptDataTypes( |
| // We reencrypt everything regardless of whether the set of encrypted |
| // types changed to ensure that any stray unencrypted entries are overwritten. |
| ReEncryptEverything(&trans); |
| - return; |
| } |
| // TODO(zea): Add unit tests that ensure no sync changes are made when not |
| @@ -1216,8 +1209,7 @@ void SyncManager::SyncInternal::ReEncryptEverything(WriteTransaction* trans) { |
| } |
| } |
| - FOR_EACH_OBSERVER(SyncManager::Observer, observers_, |
| - OnEncryptionComplete(encrypted_types)); |
| + cryptographer->MarkEncryptionComplete(); |
| } |
| SyncManager::~SyncManager() { |
| @@ -1294,12 +1286,14 @@ void SyncManager::SyncInternal::ShutdownOnSyncThread() { |
| observing_ip_address_changes_ = false; |
| if (dir_manager()) { |
| - syncable::ScopedDirLookup lookup(dir_manager(), username_for_share()); |
| - if (lookup.good()) { |
| - lookup->RemoveTransactionObserver(&js_mutation_event_observer_); |
| + { |
| + // Cryptographer should only be accessed while holding a |
| + // transaction. |
| + ReadTransaction trans(FROM_HERE, GetUserShare()); |
| + trans.GetCryptographer()->RemoveObserver(this); |
| + trans.GetLookup()-> |
| + RemoveTransactionObserver(&js_mutation_event_observer_); |
| RemoveChangeObserver(&js_mutation_event_observer_); |
| - } else { |
| - NOTREACHED(); |
| } |
| dir_manager()->FinalSaveChangesForAll(); |
| dir_manager()->Close(username_for_share()); |
| @@ -1622,11 +1616,6 @@ void SyncManager::SyncInternal::OnSyncEngineEvent( |
| allstatus_.SetCryptographerReady(cryptographer->is_ready()); |
| allstatus_.SetCryptoHasPendingKeys(cryptographer->has_pending_keys()); |
| allstatus_.SetEncryptedTypes(cryptographer->GetEncryptedTypes()); |
| - |
| - // If everything is in order(we have the passphrase) then there is no |
| - // need to inform the listeners. They will just wait for sync |
| - // completion event and if no errors have been raised it means |
| - // encryption was succesful. |
| } |
| if (!initialized_) { |
| @@ -1636,7 +1625,7 @@ void SyncManager::SyncInternal::OnSyncEngineEvent( |
| } |
| if (!event.snapshot->has_more_to_sync) { |
| - VLOG(1) << "OnSyncCycleCompleted sent"; |
| + VLOG(1) << "Sending OnSyncCycleCompleted"; |
| FOR_EACH_OBSERVER(SyncManager::Observer, observers_, |
| OnSyncCycleCompleted(event.snapshot)); |
| } |
| @@ -1876,6 +1865,21 @@ JsArgList SyncManager::SyncInternal::FindNodesContainingString( |
| return JsArgList(&return_args); |
| } |
| +void SyncManager::SyncInternal::OnEncryptedTypesChanged( |
| + const syncable::ModelTypeSet& encrypted_types, |
| + bool encrypt_everything) { |
| + // NOTE: We're in a transaction. |
| + FOR_EACH_OBSERVER( |
| + SyncManager::Observer, observers_, |
| + OnEncryptedTypesChanged(encrypted_types, encrypt_everything)); |
| +} |
| + |
| +void SyncManager::SyncInternal::OnEncryptionComplete() { |
| + // NOTE: We're in a transaction. |
| + FOR_EACH_OBSERVER( |
| + SyncManager::Observer, observers_, OnEncryptionComplete()); |
| +} |
| + |
| void SyncManager::SyncInternal::OnNotificationStateChange( |
| bool notifications_enabled) { |
| VLOG(1) << "P2P: Notifications enabled = " |
| @@ -2007,7 +2011,7 @@ void SyncManager::RefreshEncryption() { |
| data_->EncryptDataTypes(syncable::ModelTypeSet()); |
| } |
| -syncable::ModelTypeSet SyncManager::GetEncryptedDataTypes() const { |
| +syncable::ModelTypeSet SyncManager::GetEncryptedDataTypesForTest() const { |
| ReadTransaction trans(FROM_HERE, GetUserShare()); |
| return GetEncryptedTypes(&trans); |
| } |