Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(152)

Side by Side Diff: chrome/browser/sync/engine/syncapi.cc

Issue 7806005: Revert 98770 - Merge 98758 - [Sync] Gracefully handle writing to a node when the cryptographer is... (Closed) Base URL: svn://svn.chromium.org/chrome/branches/835/src/
Patch Set: Created 9 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 "chrome/browser/sync/engine/syncapi.h" 5 #include "chrome/browser/sync/engine/syncapi.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <bitset> 8 #include <bitset>
9 #include <iomanip> 9 #include <iomanip>
10 #include <list> 10 #include <list>
(...skipping 1909 matching lines...) Expand 10 before | Expand all | Expand 10 after
1920 cryptographer->Update(node.GetNigoriSpecifics()); 1920 cryptographer->Update(node.GetNigoriSpecifics());
1921 if (result == Cryptographer::NEEDS_PASSPHRASE) { 1921 if (result == Cryptographer::NEEDS_PASSPHRASE) {
1922 ObserverList<SyncManager::Observer> temp_obs_list; 1922 ObserverList<SyncManager::Observer> temp_obs_list;
1923 CopyObservers(&temp_obs_list); 1923 CopyObservers(&temp_obs_list);
1924 FOR_EACH_OBSERVER(SyncManager::Observer, temp_obs_list, 1924 FOR_EACH_OBSERVER(SyncManager::Observer, temp_obs_list,
1925 OnPassphraseRequired(sync_api::REASON_DECRYPTION)); 1925 OnPassphraseRequired(sync_api::REASON_DECRYPTION));
1926 } 1926 }
1927 1927
1928 allstatus_.SetCryptographerReady(cryptographer->is_ready()); 1928 allstatus_.SetCryptographerReady(cryptographer->is_ready());
1929 allstatus_.SetCryptoHasPendingKeys(cryptographer->has_pending_keys()); 1929 allstatus_.SetCryptoHasPendingKeys(cryptographer->has_pending_keys());
1930 allstatus_.SetEncryptedTypes(cryptographer->GetEncryptedTypes());
1931 1930
1932 return cryptographer->is_ready(); 1931 return cryptographer->is_ready();
1933 } 1932 }
1934 1933
1935 void SyncManager::SyncInternal::StartSyncingNormally() { 1934 void SyncManager::SyncInternal::StartSyncingNormally() {
1936 // Start the sync scheduler. This won't actually result in any 1935 // Start the sync scheduler. This won't actually result in any
1937 // syncing until at least the DirectoryManager broadcasts the OPENED 1936 // syncing until at least the DirectoryManager broadcasts the OPENED
1938 // event, and a valid server connection is detected. 1937 // event, and a valid server connection is detected.
1939 if (scheduler()) // NULL during certain unittests. 1938 if (scheduler()) // NULL during certain unittests.
1940 scheduler()->Start(SyncScheduler::NORMAL_MODE, NULL); 1939 scheduler()->Start(SyncScheduler::NORMAL_MODE, NULL);
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
2108 2107
2109 // TODO(tim): Bug 58231. It would be nice if SetPassphrase didn't require 2108 // TODO(tim): Bug 58231. It would be nice if SetPassphrase didn't require
2110 // messing with the Nigori node, because we can't call SetPassphrase until 2109 // messing with the Nigori node, because we can't call SetPassphrase until
2111 // download conditions are met vs Cryptographer init. It seems like it's 2110 // download conditions are met vs Cryptographer init. It seems like it's
2112 // safe to defer this work. 2111 // safe to defer this work.
2113 sync_pb::NigoriSpecifics specifics(node.GetNigoriSpecifics()); 2112 sync_pb::NigoriSpecifics specifics(node.GetNigoriSpecifics());
2114 specifics.clear_encrypted(); 2113 specifics.clear_encrypted();
2115 cryptographer->GetKeys(specifics.mutable_encrypted()); 2114 cryptographer->GetKeys(specifics.mutable_encrypted());
2116 specifics.set_using_explicit_passphrase(is_explicit); 2115 specifics.set_using_explicit_passphrase(is_explicit);
2117 node.SetNigoriSpecifics(specifics); 2116 node.SetNigoriSpecifics(specifics);
2117 ReEncryptEverything(&trans);
2118 } 2118 }
2119 2119
2120 // Does nothing if everything is already encrypted or the cryptographer has
2121 // pending keys.
2122 ReEncryptEverything(&trans);
2123
2124 VLOG(1) << "Passphrase accepted, bootstrapping encryption."; 2120 VLOG(1) << "Passphrase accepted, bootstrapping encryption.";
2125 std::string bootstrap_token; 2121 std::string bootstrap_token;
2126 cryptographer->GetBootstrapToken(&bootstrap_token); 2122 cryptographer->GetBootstrapToken(&bootstrap_token);
2127 ObserverList<SyncManager::Observer> temp_obs_list; 2123 ObserverList<SyncManager::Observer> temp_obs_list;
2128 CopyObservers(&temp_obs_list); 2124 CopyObservers(&temp_obs_list);
2129 FOR_EACH_OBSERVER(SyncManager::Observer, temp_obs_list, 2125 FOR_EACH_OBSERVER(SyncManager::Observer, temp_obs_list,
2130 OnPassphraseAccepted(bootstrap_token)); 2126 OnPassphraseAccepted(bootstrap_token));
2131 } 2127 }
2132 2128
2133 bool SyncManager::SyncInternal::IsUsingExplicitPassphrase() { 2129 bool SyncManager::SyncInternal::IsUsingExplicitPassphrase() {
(...skipping 17 matching lines...) Expand all
2151 WriteTransaction trans(FROM_HERE, GetUserShare()); 2147 WriteTransaction trans(FROM_HERE, GetUserShare());
2152 WriteNode node(&trans); 2148 WriteNode node(&trans);
2153 if (!node.InitByTagLookup(kNigoriTag)) { 2149 if (!node.InitByTagLookup(kNigoriTag)) {
2154 NOTREACHED() << "Unable to set encrypted datatypes because Nigori node not " 2150 NOTREACHED() << "Unable to set encrypted datatypes because Nigori node not "
2155 << "found."; 2151 << "found.";
2156 return; 2152 return;
2157 } 2153 }
2158 2154
2159 Cryptographer* cryptographer = trans.GetCryptographer(); 2155 Cryptographer* cryptographer = trans.GetCryptographer();
2160 2156
2161 if (!cryptographer->is_ready()) { 2157 if (!cryptographer->is_initialized()) {
2162 VLOG(1) << "Attempting to encrypt datatypes when cryptographer not " 2158 VLOG(1) << "Attempting to encrypt datatypes when cryptographer not "
2163 << "initialized, prompting for passphrase."; 2159 << "initialized, prompting for passphrase.";
2164 ObserverList<SyncManager::Observer> temp_obs_list; 2160 ObserverList<SyncManager::Observer> temp_obs_list;
2165 CopyObservers(&temp_obs_list); 2161 CopyObservers(&temp_obs_list);
2166 // TODO(zea): this isn't really decryption, but that's the only way we have 2162 // TODO(zea): this isn't really decryption, but that's the only way we have
2167 // to prompt the user for a passsphrase. See http://crbug.com/91379. 2163 // to prompt the user for a passsphrase. See http://crbug.com/91379.
2168 FOR_EACH_OBSERVER(SyncManager::Observer, temp_obs_list, 2164 FOR_EACH_OBSERVER(SyncManager::Observer, temp_obs_list,
2169 OnPassphraseRequired(sync_api::REASON_DECRYPTION)); 2165 OnPassphraseRequired(sync_api::REASON_DECRYPTION));
2170 return; 2166 return;
2171 } 2167 }
2172 2168
2173 // Update the Nigori node's set of encrypted datatypes. 2169 // Update the Nigori node's set of encrypted datatypes.
2174 // Note, we merge the current encrypted types with those requested. Once a 2170 // Note, we merge the current encrypted types with those requested. Once a
2175 // datatypes is marked as needing encryption, it is never unmarked. 2171 // datatypes is marked as needing encryption, it is never unmarked.
2176 sync_pb::NigoriSpecifics nigori; 2172 sync_pb::NigoriSpecifics nigori;
2177 nigori.CopyFrom(node.GetNigoriSpecifics()); 2173 nigori.CopyFrom(node.GetNigoriSpecifics());
2178 syncable::ModelTypeSet current_encrypted_types = GetEncryptedTypes(&trans); 2174 syncable::ModelTypeSet current_encrypted_types = GetEncryptedTypes(&trans);
2179 syncable::ModelTypeSet newly_encrypted_types; 2175 syncable::ModelTypeSet newly_encrypted_types;
2180 std::set_union(current_encrypted_types.begin(), current_encrypted_types.end(), 2176 std::set_union(current_encrypted_types.begin(), current_encrypted_types.end(),
2181 encrypted_types.begin(), encrypted_types.end(), 2177 encrypted_types.begin(), encrypted_types.end(),
2182 std::inserter(newly_encrypted_types, 2178 std::inserter(newly_encrypted_types,
2183 newly_encrypted_types.begin())); 2179 newly_encrypted_types.begin()));
2184 allstatus_.SetEncryptedTypes(newly_encrypted_types); 2180 allstatus_.SetEncryptedTypes(newly_encrypted_types);
2181 if (newly_encrypted_types == current_encrypted_types) {
2182 // Set of encrypted types has not changed, just notify and return.
2183 ObserverList<SyncManager::Observer> temp_obs_list;
2184 CopyObservers(&temp_obs_list);
2185 FOR_EACH_OBSERVER(SyncManager::Observer, temp_obs_list,
2186 OnEncryptionComplete(current_encrypted_types));
2187 return;
2188 }
2185 syncable::FillNigoriEncryptedTypes(newly_encrypted_types, &nigori); 2189 syncable::FillNigoriEncryptedTypes(newly_encrypted_types, &nigori);
2186 node.SetNigoriSpecifics(nigori); 2190 node.SetNigoriSpecifics(nigori);
2187 2191
2188 cryptographer->SetEncryptedTypes(nigori); 2192 cryptographer->SetEncryptedTypes(nigori);
2189 2193
2190 // We reencrypt everything regardless of whether the set of encrypted 2194 // TODO(zea): only reencrypt this datatype? ReEncrypting everything is a
2191 // types changed to ensure that any stray unencrypted entries are overwritten. 2195 // safer approach, and should not impact anything that is already encrypted
2196 // (redundant changes are ignored).
2192 ReEncryptEverything(&trans); 2197 ReEncryptEverything(&trans);
2193 return; 2198 return;
2194 } 2199 }
2195 2200
2196 // TODO(zea): Add unit tests that ensure no sync changes are made when not 2201 // TODO(zea): Add unit tests that ensure no sync changes are made when not
2197 // needed. 2202 // needed.
2198 void SyncManager::SyncInternal::ReEncryptEverything(WriteTransaction* trans) { 2203 void SyncManager::SyncInternal::ReEncryptEverything(WriteTransaction* trans) {
2199 Cryptographer* cryptographer = trans->GetCryptographer(); 2204 syncable::ModelTypeSet encrypted_types =
2200 if (!cryptographer || !cryptographer->is_ready()) 2205 GetEncryptedTypes(trans);
2201 return;
2202 syncable::ModelTypeSet encrypted_types = GetEncryptedTypes(trans);
2203 ModelSafeRoutingInfo routes; 2206 ModelSafeRoutingInfo routes;
2204 registrar_->GetModelSafeRoutingInfo(&routes); 2207 registrar_->GetModelSafeRoutingInfo(&routes);
2205 std::string tag; 2208 std::string tag;
2206 for (syncable::ModelTypeSet::iterator iter = encrypted_types.begin(); 2209 for (syncable::ModelTypeSet::iterator iter = encrypted_types.begin();
2207 iter != encrypted_types.end(); ++iter) { 2210 iter != encrypted_types.end(); ++iter) {
2208 if (*iter == syncable::PASSWORDS || routes.count(*iter) == 0) 2211 if (*iter == syncable::PASSWORDS || routes.count(*iter) == 0)
2209 continue; 2212 continue;
2210 ReadNode type_root(trans); 2213 ReadNode type_root(trans);
2211 tag = syncable::ModelTypeToRootTag(*iter); 2214 tag = syncable::ModelTypeToRootTag(*iter);
2212 if (!type_root.InitByTagLookup(tag)) { 2215 if (!type_root.InitByTagLookup(tag)) {
(...skipping 920 matching lines...) Expand 10 before | Expand all | Expand 10 after
3133 void SyncManager::TriggerOnIncomingNotificationForTest( 3136 void SyncManager::TriggerOnIncomingNotificationForTest(
3134 const syncable::ModelTypeBitSet& model_types) { 3137 const syncable::ModelTypeBitSet& model_types) {
3135 syncable::ModelTypePayloadMap model_types_with_payloads = 3138 syncable::ModelTypePayloadMap model_types_with_payloads =
3136 syncable::ModelTypePayloadMapFromBitSet(model_types, 3139 syncable::ModelTypePayloadMapFromBitSet(model_types,
3137 std::string()); 3140 std::string());
3138 3141
3139 data_->OnIncomingNotification(model_types_with_payloads); 3142 data_->OnIncomingNotification(model_types_with_payloads);
3140 } 3143 }
3141 3144
3142 } // namespace sync_api 3145 } // namespace sync_api
OLDNEW
« no previous file with comments | « chrome/browser/sync/engine/get_commit_ids_command.cc ('k') | chrome/browser/sync/engine/syncer_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698