| Index: chrome/browser/sync/engine/syncapi.cc
|
| diff --git a/chrome/browser/sync/engine/syncapi.cc b/chrome/browser/sync/engine/syncapi.cc
|
| index 813ae408dd943bac499e423af2745cd7cb323664..d6b4c586afafc0c4dedf58127f53df2c1f7cfef6 100644
|
| --- a/chrome/browser/sync/engine/syncapi.cc
|
| +++ b/chrome/browser/sync/engine/syncapi.cc
|
| @@ -1641,7 +1641,33 @@ SyncManager::Observer::~Observer() {}
|
| SyncManager::SyncManager(const std::string& name)
|
| : data_(new SyncInternal(name)) {}
|
|
|
| -SyncManager::Status::Status() {
|
| +SyncManager::Status::Status()
|
| + : summary(INVALID),
|
| + authenticated(false),
|
| + server_up(false),
|
| + server_reachable(false),
|
| + server_broken(false),
|
| + notifications_enabled(false),
|
| + notifications_received(0),
|
| + notifiable_commits(0),
|
| + max_consecutive_errors(0),
|
| + unsynced_count(0),
|
| + conflicting_count(0),
|
| + syncing(false),
|
| + initial_sync_ended(false),
|
| + syncer_stuck(false),
|
| + updates_available(0),
|
| + updates_received(0),
|
| + tombstone_updates_received(0),
|
| + disk_full(false),
|
| + num_local_overwrites_total(0),
|
| + num_server_overwrites_total(0),
|
| + nonempty_get_updates(0),
|
| + empty_get_updates(0),
|
| + useless_sync_cycles(0),
|
| + useful_sync_cycles(0),
|
| + cryptographer_ready(false),
|
| + crypto_has_pending_keys(false) {
|
| }
|
|
|
| SyncManager::Status::~Status() {
|
| @@ -2096,12 +2122,18 @@ void SyncManager::SyncInternal::EncryptDataTypes(
|
| Cryptographer* cryptographer = trans.GetCryptographer();
|
|
|
| if (!cryptographer->is_initialized()) {
|
| - NOTREACHED() << "Attempting to encrypt datatypes when cryptographer not "
|
| - << "initialized.";
|
| + VLOG(1) << "Attempting to encrypt datatypes when cryptographer not "
|
| + << "initialized, prompting for passphrase.";
|
| + ObserverList<SyncManager::Observer> temp_obs_list;
|
| + CopyObservers(&temp_obs_list);
|
| + // TODO(zea): this isn't really decryption, but that's the only way we have
|
| + // to prompt the user for a passsphrase. See http://crbug.com/91379.
|
| + FOR_EACH_OBSERVER(SyncManager::Observer, temp_obs_list,
|
| + OnPassphraseRequired(sync_api::REASON_DECRYPTION));
|
| return;
|
| }
|
|
|
| - // Update the Nigori node set of encrypted datatypes so other machines notice.
|
| + // Update the Nigori node's set of encrypted datatypes.
|
| // Note, we merge the current encrypted types with those requested. Once a
|
| // datatypes is marked as needing encryption, it is never unmarked.
|
| sync_pb::NigoriSpecifics nigori;
|
| @@ -2113,8 +2145,14 @@ void SyncManager::SyncInternal::EncryptDataTypes(
|
| std::inserter(newly_encrypted_types,
|
| newly_encrypted_types.begin()));
|
| allstatus_.SetEncryptedTypes(newly_encrypted_types);
|
| - if (newly_encrypted_types == current_encrypted_types)
|
| - return; // Set of encrypted types did not change.
|
| + if (newly_encrypted_types == current_encrypted_types) {
|
| + // Set of encrypted types has not changed, just notify and return.
|
| + ObserverList<SyncManager::Observer> temp_obs_list;
|
| + CopyObservers(&temp_obs_list);
|
| + FOR_EACH_OBSERVER(SyncManager::Observer, temp_obs_list,
|
| + OnEncryptionComplete(current_encrypted_types));
|
| + return;
|
| + }
|
| syncable::FillNigoriEncryptedTypes(newly_encrypted_types, &nigori);
|
| node.SetNigoriSpecifics(nigori);
|
|
|
| @@ -2159,7 +2197,7 @@ void SyncManager::SyncInternal::ReEncryptEverything(WriteTransaction* trans) {
|
| WriteNode child(trans);
|
| if (!child.InitByIdLookup(child_id)) {
|
| NOTREACHED();
|
| - return;
|
| + continue;
|
| }
|
| if (child.GetIsFolder()) {
|
| to_visit.push(child.GetFirstChildId());
|
| @@ -2178,20 +2216,19 @@ void SyncManager::SyncInternal::ReEncryptEverything(WriteTransaction* trans) {
|
| ReadNode passwords_root(trans);
|
| std::string passwords_tag =
|
| syncable::ModelTypeToRootTag(syncable::PASSWORDS);
|
| - if (!passwords_root.InitByTagLookup(passwords_tag)) {
|
| - LOG(WARNING) << "No passwords to reencrypt.";
|
| - return;
|
| - }
|
| -
|
| - int64 child_id = passwords_root.GetFirstChildId();
|
| - while (child_id != kInvalidId) {
|
| - WriteNode child(trans);
|
| - if (!child.InitByIdLookup(child_id)) {
|
| - NOTREACHED();
|
| - return;
|
| + // It's possible we'll have the password routing info and not the password
|
| + // root if we attempted to SetPassphrase before passwords was enabled.
|
| + if (passwords_root.InitByTagLookup(passwords_tag)) {
|
| + int64 child_id = passwords_root.GetFirstChildId();
|
| + while (child_id != kInvalidId) {
|
| + WriteNode child(trans);
|
| + if (!child.InitByIdLookup(child_id)) {
|
| + NOTREACHED();
|
| + return;
|
| + }
|
| + child.SetPasswordSpecifics(child.GetPasswordSpecifics());
|
| + child_id = child.GetSuccessorId();
|
| }
|
| - child.SetPasswordSpecifics(child.GetPasswordSpecifics());
|
| - child_id = child.GetSuccessorId();
|
| }
|
| }
|
|
|
|
|