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

Side by Side Diff: chrome/browser/sync/internal_api/sync_manager.cc

Issue 8356026: [Sync] Cache encrypted types info in ProfileSyncService (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address comments (retry) Created 9 years, 1 month 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/internal_api/sync_manager.h" 5 #include "chrome/browser/sync/internal_api/sync_manager.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/base64.h" 9 #include "base/base64.h"
10 #include "base/command_line.h" 10 #include "base/command_line.h"
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
112 } 112 }
113 113
114 } // namespace 114 } // namespace
115 115
116 namespace sync_api { 116 namespace sync_api {
117 117
118 ////////////////////////////////////////////////////////////////////////// 118 //////////////////////////////////////////////////////////////////////////
119 // SyncManager's implementation: SyncManager::SyncInternal 119 // SyncManager's implementation: SyncManager::SyncInternal
120 class SyncManager::SyncInternal 120 class SyncManager::SyncInternal
121 : public net::NetworkChangeNotifier::IPAddressObserver, 121 : public net::NetworkChangeNotifier::IPAddressObserver,
122 public browser_sync::Cryptographer::Observer,
122 public sync_notifier::SyncNotifierObserver, 123 public sync_notifier::SyncNotifierObserver,
123 public JsBackend, 124 public JsBackend,
124 public SyncEngineEventListener, 125 public SyncEngineEventListener,
125 public ServerConnectionEventListener, 126 public ServerConnectionEventListener,
126 public syncable::DirectoryChangeDelegate { 127 public syncable::DirectoryChangeDelegate {
127 static const int kDefaultNudgeDelayMilliseconds; 128 static const int kDefaultNudgeDelayMilliseconds;
128 static const int kPreferencesNudgeDelayMilliseconds; 129 static const int kPreferencesNudgeDelayMilliseconds;
129 public: 130 public:
130 explicit SyncInternal(const std::string& name) 131 explicit SyncInternal(const std::string& name)
131 : name_(name), 132 : name_(name),
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
216 217
217 // Whether or not the Nigori node is encrypted using an explicit passphrase. 218 // Whether or not the Nigori node is encrypted using an explicit passphrase.
218 bool IsUsingExplicitPassphrase(); 219 bool IsUsingExplicitPassphrase();
219 220
220 // Update the Cryptographer from the current nigori node. 221 // Update the Cryptographer from the current nigori node.
221 // Note: opens a transaction and can trigger an ON_PASSPHRASE_REQUIRED, so 222 // Note: opens a transaction and can trigger an ON_PASSPHRASE_REQUIRED, so
222 // should only be called after syncapi is fully initialized. 223 // should only be called after syncapi is fully initialized.
223 // Returns true if cryptographer is ready, false otherwise. 224 // Returns true if cryptographer is ready, false otherwise.
224 bool UpdateCryptographerFromNigori(); 225 bool UpdateCryptographerFromNigori();
225 226
226 // Set the datatypes we want to encrypt and encrypt any nodes as necessary. 227 // Updates the nigori node with any new encrypted types and then
227 // Note: |encrypted_types| will be unioned with the current set of encrypted 228 // encrypts the nodes for those new data types as well as other
228 // types, as we do not currently support decrypting datatypes. 229 // nodes that should be encrypted but aren't. Triggers
229 void EncryptDataTypes(const syncable::ModelTypeSet& encrypted_types); 230 // OnPassphraseRequired if the cryptographer isn't ready.
231 void RefreshEncryption();
230 232
231 // Try to set the current passphrase to |passphrase|, and record whether 233 // Try to set the current passphrase to |passphrase|, and record whether
232 // it is an explicit passphrase or implicitly using gaia in the Nigori 234 // it is an explicit passphrase or implicitly using gaia in the Nigori
233 // node. 235 // node.
234 void SetPassphrase(const std::string& passphrase, bool is_explicit); 236 void SetPassphrase(const std::string& passphrase, bool is_explicit);
235 237
236 // Call periodically from a database-safe thread to persist recent changes 238 // Call periodically from a database-safe thread to persist recent changes
237 // to the syncapi model. 239 // to the syncapi model.
238 void SaveChanges(); 240 void SaveChanges();
239 241
(...skipping 12 matching lines...) Expand all
252 virtual void HandleCalculateChangesChangeEventFromSyncer( 254 virtual void HandleCalculateChangesChangeEventFromSyncer(
253 const ImmutableWriteTransactionInfo& write_transaction_info, 255 const ImmutableWriteTransactionInfo& write_transaction_info,
254 syncable::BaseTransaction* trans) OVERRIDE; 256 syncable::BaseTransaction* trans) OVERRIDE;
255 257
256 // Listens for notifications from the ServerConnectionManager 258 // Listens for notifications from the ServerConnectionManager
257 void HandleServerConnectionEvent(const ServerConnectionEvent& event); 259 void HandleServerConnectionEvent(const ServerConnectionEvent& event);
258 260
259 // Open the directory named with username_for_share 261 // Open the directory named with username_for_share
260 bool OpenDirectory(); 262 bool OpenDirectory();
261 263
264 // Cryptographer::Observer implementation.
265 virtual void OnEncryptedTypesChanged(
266 const syncable::ModelTypeSet& encrypted_types,
267 bool encrypt_everything) OVERRIDE;
268
262 // SyncNotifierObserver implementation. 269 // SyncNotifierObserver implementation.
263 virtual void OnNotificationStateChange( 270 virtual void OnNotificationStateChange(
264 bool notifications_enabled) OVERRIDE; 271 bool notifications_enabled) OVERRIDE;
265 272
266 virtual void OnIncomingNotification( 273 virtual void OnIncomingNotification(
267 const syncable::ModelTypePayloadMap& type_payloads) OVERRIDE; 274 const syncable::ModelTypePayloadMap& type_payloads) OVERRIDE;
268 275
269 virtual void StoreState(const std::string& cookie) OVERRIDE; 276 virtual void StoreState(const std::string& cookie) OVERRIDE;
270 277
271 void AddChangeObserver(SyncManager::ChangeObserver* observer); 278 void AddChangeObserver(SyncManager::ChangeObserver* observer);
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after
432 bool ChangeBuffersAreEmpty() { 439 bool ChangeBuffersAreEmpty() {
433 for (int i = 0; i < syncable::MODEL_TYPE_COUNT; ++i) { 440 for (int i = 0; i < syncable::MODEL_TYPE_COUNT; ++i) {
434 if (!change_buffers_[i].IsEmpty()) 441 if (!change_buffers_[i].IsEmpty())
435 return false; 442 return false;
436 } 443 }
437 return true; 444 return true;
438 } 445 }
439 446
440 void ReEncryptEverything(WriteTransaction* trans); 447 void ReEncryptEverything(WriteTransaction* trans);
441 448
442 // Initializes (bootstraps) the Cryptographer if NIGORI has finished
443 // initial sync so that it can immediately start encrypting / decrypting.
444 // If the restored key is incompatible with the current version of the NIGORI
445 // node (which could happen if a restart occurred just after an update to
446 // NIGORI was downloaded and the user must enter a new passphrase to decrypt)
447 // then we will raise OnPassphraseRequired and set pending keys for
448 // decryption. Otherwise, the cryptographer is made ready (is_ready()).
449 void BootstrapEncryption(const std::string& restored_key_for_bootstrapping);
450
451 // Called for every notification. This updates the notification statistics 449 // Called for every notification. This updates the notification statistics
452 // to be displayed in about:sync. 450 // to be displayed in about:sync.
453 void UpdateNotificationInfo( 451 void UpdateNotificationInfo(
454 const syncable::ModelTypePayloadMap& type_payloads); 452 const syncable::ModelTypePayloadMap& type_payloads);
455 453
456 // Checks for server reachabilty and requests a nudge. 454 // Checks for server reachabilty and requests a nudge.
457 void OnIPAddressChangedImpl(); 455 void OnIPAddressChangedImpl();
458 456
459 // Helper function used only by the constructor. 457 // Helper function used only by the constructor.
460 void BindJsMessageHandler( 458 void BindJsMessageHandler(
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after
675 { 673 {
676 // Update the cryptographer to know we're now encrypting everything. 674 // Update the cryptographer to know we're now encrypting everything.
677 WriteTransaction trans(FROM_HERE, GetUserShare()); 675 WriteTransaction trans(FROM_HERE, GetUserShare());
678 Cryptographer* cryptographer = trans.GetCryptographer(); 676 Cryptographer* cryptographer = trans.GetCryptographer();
679 // Only set encrypt everything if we know we can encrypt. This allows the 677 // Only set encrypt everything if we know we can encrypt. This allows the
680 // user to cancel encryption if they have forgotten their passphrase. 678 // user to cancel encryption if they have forgotten their passphrase.
681 if (cryptographer->is_ready()) 679 if (cryptographer->is_ready())
682 cryptographer->set_encrypt_everything(); 680 cryptographer->set_encrypt_everything();
683 } 681 }
684 682
685 // Call with empty set. Reads from cryptographer so will automatically encrypt 683 // Reads from cryptographer so will automatically encrypt all
686 // all datatypes and update the nigori node as necessary. Will trigger 684 // datatypes and update the nigori node as necessary. Will trigger
687 // OnPassphraseRequired if necessary. 685 // OnPassphraseRequired if necessary.
688 data_->EncryptDataTypes(syncable::ModelTypeSet()); 686 data_->RefreshEncryption();
689 } 687 }
690 688
691 bool SyncManager::EncryptEverythingEnabled() const { 689 bool SyncManager::EncryptEverythingEnabledForTest() const {
692 ReadTransaction trans(FROM_HERE, GetUserShare()); 690 ReadTransaction trans(FROM_HERE, GetUserShare());
693 return trans.GetCryptographer()->encrypt_everything(); 691 return trans.GetCryptographer()->encrypt_everything();
694 } 692 }
695 693
696 bool SyncManager::IsUsingExplicitPassphrase() { 694 bool SyncManager::IsUsingExplicitPassphrase() {
697 return data_ && data_->IsUsingExplicitPassphrase(); 695 return data_ && data_->IsUsingExplicitPassphrase();
698 } 696 }
699 697
700 void SyncManager::RequestCleanupDisabledTypes() { 698 void SyncManager::RequestCleanupDisabledTypes() {
701 DCHECK(thread_checker_.CalledOnValidThread()); 699 DCHECK(thread_checker_.CalledOnValidThread());
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
803 bool signed_in = SignIn(credentials); 801 bool signed_in = SignIn(credentials);
804 802
805 if (signed_in || setup_for_test_mode_) { 803 if (signed_in || setup_for_test_mode_) {
806 if (scheduler()) { 804 if (scheduler()) {
807 scheduler()->Start( 805 scheduler()->Start(
808 browser_sync::SyncScheduler::CONFIGURATION_MODE, base::Closure()); 806 browser_sync::SyncScheduler::CONFIGURATION_MODE, base::Closure());
809 } 807 }
810 808
811 initialized_ = true; 809 initialized_ = true;
812 810
813 // The following calls check that initialized_ is true. 811 // Cryptographer should only be accessed while holding a
814 BootstrapEncryption(restored_key_for_bootstrapping); 812 // transaction. Grabbing the user share for the transaction
813 // checks the initialization state, so this must come after
814 // |initialized_| is set to true.
815 ReadTransaction trans(FROM_HERE, GetUserShare());
816 trans.GetCryptographer()->Bootstrap(restored_key_for_bootstrapping);
817 trans.GetCryptographer()->AddObserver(this);
815 } 818 }
816 819
817 // Notify that initialization is complete. Note: This should be the last to 820 // Notify that initialization is complete. Note: This should be the last to
818 // execute if |signed_in| is false. Reason being in that case we would 821 // execute if |signed_in| is false. Reason being in that case we would
819 // post a task to shutdown sync. But if this function posts any other tasks 822 // post a task to shutdown sync. But if this function posts any other tasks
820 // on the UI thread and if shutdown wins then that tasks would execute on 823 // on the UI thread and if shutdown wins then that tasks would execute on
821 // a freed pointer. This is because UI thread is not shut down. 824 // a freed pointer. This is because UI thread is not shut down.
822 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, 825 FOR_EACH_OBSERVER(SyncManager::Observer, observers_,
823 OnInitializationComplete( 826 OnInitializationComplete(
824 WeakHandle<JsBackend>(weak_ptr_factory_.GetWeakPtr()), 827 WeakHandle<JsBackend>(weak_ptr_factory_.GetWeakPtr()),
825 signed_in)); 828 signed_in));
826 829
827 if (!signed_in && !setup_for_test_mode_) 830 if (!signed_in && !setup_for_test_mode_)
828 return false; 831 return false;
829 832
830 sync_notifier_->AddObserver(this); 833 sync_notifier_->AddObserver(this);
831 834
832 return signed_in; 835 return signed_in;
833 } 836 }
834 837
835 void SyncManager::SyncInternal::BootstrapEncryption(
836 const std::string& restored_key_for_bootstrapping) {
837 // Cryptographer should only be accessed while holding a transaction.
838 ReadTransaction trans(FROM_HERE, GetUserShare());
839 Cryptographer* cryptographer = trans.GetCryptographer();
840
841 // Set the bootstrap token before bailing out if nigori node is not there.
842 // This could happen if server asked us to migrate nigri.
843 cryptographer->Bootstrap(restored_key_for_bootstrapping);
844 }
845
846 bool SyncManager::SyncInternal::UpdateCryptographerFromNigori() { 838 bool SyncManager::SyncInternal::UpdateCryptographerFromNigori() {
847 DCHECK(initialized_); 839 DCHECK(initialized_);
848 syncable::ScopedDirLookup lookup(dir_manager(), username_for_share()); 840 syncable::ScopedDirLookup lookup(dir_manager(), username_for_share());
849 if (!lookup.good()) { 841 if (!lookup.good()) {
850 NOTREACHED() << "BootstrapEncryption: lookup not good so bailing out"; 842 NOTREACHED()
843 << "UpdateCryptographerFromNigori: lookup not good so bailing out";
851 return false; 844 return false;
852 } 845 }
853 if (!lookup->initial_sync_ended_for_type(syncable::NIGORI)) 846 if (!lookup->initial_sync_ended_for_type(syncable::NIGORI))
854 return false; // Should only happen during first time sync. 847 return false; // Should only happen during first time sync.
855 848
856 WriteTransaction trans(FROM_HERE, GetUserShare()); 849 WriteTransaction trans(FROM_HERE, GetUserShare());
857 Cryptographer* cryptographer = trans.GetCryptographer(); 850 Cryptographer* cryptographer = trans.GetCryptographer();
858 851
859 WriteNode node(&trans); 852 WriteNode node(&trans);
860 if (!node.InitByTagLookup(kNigoriTag)) { 853 if (!node.InitByTagLookup(kNigoriTag)) {
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after
1093 ReadNode node(&trans); 1086 ReadNode node(&trans);
1094 if (!node.InitByTagLookup(kNigoriTag)) { 1087 if (!node.InitByTagLookup(kNigoriTag)) {
1095 // TODO(albertb): Plumb an UnrecoverableError all the way back to the PSS. 1088 // TODO(albertb): Plumb an UnrecoverableError all the way back to the PSS.
1096 NOTREACHED(); 1089 NOTREACHED();
1097 return false; 1090 return false;
1098 } 1091 }
1099 1092
1100 return node.GetNigoriSpecifics().using_explicit_passphrase(); 1093 return node.GetNigoriSpecifics().using_explicit_passphrase();
1101 } 1094 }
1102 1095
1103 void SyncManager::SyncInternal::EncryptDataTypes( 1096 void SyncManager::SyncInternal::RefreshEncryption() {
1104 const syncable::ModelTypeSet& encrypted_types) {
1105 DCHECK(initialized_); 1097 DCHECK(initialized_);
1106 VLOG(1) << "Attempting to encrypt datatypes "
1107 << syncable::ModelTypeSetToString(encrypted_types);
1108 1098
1109 WriteTransaction trans(FROM_HERE, GetUserShare()); 1099 WriteTransaction trans(FROM_HERE, GetUserShare());
1110 WriteNode node(&trans); 1100 WriteNode node(&trans);
1111 if (!node.InitByTagLookup(kNigoriTag)) { 1101 if (!node.InitByTagLookup(kNigoriTag)) {
1112 NOTREACHED() << "Unable to set encrypted datatypes because Nigori node not " 1102 NOTREACHED() << "Unable to set encrypted datatypes because Nigori node not "
1113 << "found."; 1103 << "found.";
1114 return; 1104 return;
1115 } 1105 }
1116 1106
1117 Cryptographer* cryptographer = trans.GetCryptographer(); 1107 Cryptographer* cryptographer = trans.GetCryptographer();
1118 1108
1119 if (!cryptographer->is_ready()) { 1109 if (!cryptographer->is_ready()) {
1120 VLOG(1) << "Attempting to encrypt datatypes when cryptographer not " 1110 VLOG(1) << "Attempting to encrypt datatypes when cryptographer not "
1121 << "initialized, prompting for passphrase."; 1111 << "initialized, prompting for passphrase.";
1122 // TODO(zea): this isn't really decryption, but that's the only way we have 1112 // TODO(zea): this isn't really decryption, but that's the only way we have
1123 // to prompt the user for a passsphrase. See http://crbug.com/91379. 1113 // to prompt the user for a passsphrase. See http://crbug.com/91379.
1124 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, 1114 FOR_EACH_OBSERVER(SyncManager::Observer, observers_,
1125 OnPassphraseRequired(sync_api::REASON_DECRYPTION)); 1115 OnPassphraseRequired(sync_api::REASON_DECRYPTION));
1126 return; 1116 return;
1127 } 1117 }
1128 1118
1129 // Update the Nigori node's set of encrypted datatypes. 1119 // Update the Nigori node's set of encrypted datatypes.
1130 // Note, we merge the current encrypted types with those requested. Once a 1120 // Note, we merge the current encrypted types with those requested. Once a
1131 // datatypes is marked as needing encryption, it is never unmarked. 1121 // datatypes is marked as needing encryption, it is never unmarked.
1132 cryptographer->SetEncryptedTypes(encrypted_types);
1133 sync_pb::NigoriSpecifics nigori; 1122 sync_pb::NigoriSpecifics nigori;
1134 nigori.CopyFrom(node.GetNigoriSpecifics()); 1123 nigori.CopyFrom(node.GetNigoriSpecifics());
1135 cryptographer->UpdateNigoriFromEncryptedTypes(&nigori); 1124 cryptographer->UpdateNigoriFromEncryptedTypes(&nigori);
1136 node.SetNigoriSpecifics(nigori); 1125 node.SetNigoriSpecifics(nigori);
1137 allstatus_.SetEncryptedTypes(cryptographer->GetEncryptedTypes()); 1126 allstatus_.SetEncryptedTypes(cryptographer->GetEncryptedTypes());
1138 1127
1139 // We reencrypt everything regardless of whether the set of encrypted 1128 // We reencrypt everything regardless of whether the set of encrypted
1140 // types changed to ensure that any stray unencrypted entries are overwritten. 1129 // types changed to ensure that any stray unencrypted entries are overwritten.
1141 ReEncryptEverything(&trans); 1130 ReEncryptEverything(&trans);
1142 return;
1143 } 1131 }
1144 1132
1145 // TODO(zea): Add unit tests that ensure no sync changes are made when not 1133 // TODO(zea): Add unit tests that ensure no sync changes are made when not
1146 // needed. 1134 // needed.
1147 void SyncManager::SyncInternal::ReEncryptEverything(WriteTransaction* trans) { 1135 void SyncManager::SyncInternal::ReEncryptEverything(WriteTransaction* trans) {
1148 Cryptographer* cryptographer = trans->GetCryptographer(); 1136 Cryptographer* cryptographer = trans->GetCryptographer();
1149 if (!cryptographer || !cryptographer->is_ready()) 1137 if (!cryptographer || !cryptographer->is_ready())
1150 return; 1138 return;
1151 syncable::ModelTypeSet encrypted_types = GetEncryptedTypes(trans); 1139 syncable::ModelTypeSet encrypted_types = GetEncryptedTypes(trans);
1152 ModelSafeRoutingInfo routes; 1140 ModelSafeRoutingInfo routes;
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
1209 if (!child.InitByIdLookup(child_id)) { 1197 if (!child.InitByIdLookup(child_id)) {
1210 NOTREACHED(); 1198 NOTREACHED();
1211 return; 1199 return;
1212 } 1200 }
1213 child.SetPasswordSpecifics(child.GetPasswordSpecifics()); 1201 child.SetPasswordSpecifics(child.GetPasswordSpecifics());
1214 child_id = child.GetSuccessorId(); 1202 child_id = child.GetSuccessorId();
1215 } 1203 }
1216 } 1204 }
1217 } 1205 }
1218 1206
1219 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, 1207 // NOTE: We notify from within a transaction.
1220 OnEncryptionComplete(encrypted_types)); 1208 FOR_EACH_OBSERVER(
1209 SyncManager::Observer, observers_, OnEncryptionComplete());
1221 } 1210 }
1222 1211
1223 SyncManager::~SyncManager() { 1212 SyncManager::~SyncManager() {
1224 DCHECK(thread_checker_.CalledOnValidThread()); 1213 DCHECK(thread_checker_.CalledOnValidThread());
1225 delete data_; 1214 delete data_;
1226 } 1215 }
1227 1216
1228 void SyncManager::AddChangeObserver(ChangeObserver* observer) { 1217 void SyncManager::AddChangeObserver(ChangeObserver* observer) {
1229 DCHECK(thread_checker_.CalledOnValidThread()); 1218 DCHECK(thread_checker_.CalledOnValidThread());
1230 data_->AddChangeObserver(observer); 1219 data_->AddChangeObserver(observer);
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
1287 1276
1288 if (connection_manager_.get()) { 1277 if (connection_manager_.get()) {
1289 connection_manager_->RemoveListener(this); 1278 connection_manager_->RemoveListener(this);
1290 } 1279 }
1291 connection_manager_.reset(); 1280 connection_manager_.reset();
1292 1281
1293 net::NetworkChangeNotifier::RemoveIPAddressObserver(this); 1282 net::NetworkChangeNotifier::RemoveIPAddressObserver(this);
1294 observing_ip_address_changes_ = false; 1283 observing_ip_address_changes_ = false;
1295 1284
1296 if (dir_manager()) { 1285 if (dir_manager()) {
1297 syncable::ScopedDirLookup lookup(dir_manager(), username_for_share()); 1286 {
1298 if (lookup.good()) { 1287 // Cryptographer should only be accessed while holding a
1299 lookup->RemoveTransactionObserver(&js_mutation_event_observer_); 1288 // transaction.
1289 ReadTransaction trans(FROM_HERE, GetUserShare());
1290 trans.GetCryptographer()->RemoveObserver(this);
1291 trans.GetLookup()->
1292 RemoveTransactionObserver(&js_mutation_event_observer_);
1300 RemoveChangeObserver(&js_mutation_event_observer_); 1293 RemoveChangeObserver(&js_mutation_event_observer_);
1301 } else {
1302 NOTREACHED();
1303 } 1294 }
1304 dir_manager()->FinalSaveChangesForAll(); 1295 dir_manager()->FinalSaveChangesForAll();
1305 dir_manager()->Close(username_for_share()); 1296 dir_manager()->Close(username_for_share());
1306 } 1297 }
1307 1298
1308 // Reset the DirectoryManager and UserSettings so they relinquish sqlite 1299 // Reset the DirectoryManager and UserSettings so they relinquish sqlite
1309 // handles to backing files. 1300 // handles to backing files.
1310 share_.dir_manager.reset(); 1301 share_.dir_manager.reset();
1311 1302
1312 setup_for_test_mode_ = false; 1303 setup_for_test_mode_ = false;
(...skipping 302 matching lines...) Expand 10 before | Expand all | Expand 10 after
1615 event.snapshot->initial_sync_ended.test(syncable::NIGORI)) { 1606 event.snapshot->initial_sync_ended.test(syncable::NIGORI)) {
1616 VLOG(1) << "OnPassphraseRequired sent because cryptographer is not " 1607 VLOG(1) << "OnPassphraseRequired sent because cryptographer is not "
1617 << "ready"; 1608 << "ready";
1618 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, 1609 FOR_EACH_OBSERVER(SyncManager::Observer, observers_,
1619 OnPassphraseRequired(sync_api::REASON_ENCRYPTION)); 1610 OnPassphraseRequired(sync_api::REASON_ENCRYPTION));
1620 } 1611 }
1621 1612
1622 allstatus_.SetCryptographerReady(cryptographer->is_ready()); 1613 allstatus_.SetCryptographerReady(cryptographer->is_ready());
1623 allstatus_.SetCryptoHasPendingKeys(cryptographer->has_pending_keys()); 1614 allstatus_.SetCryptoHasPendingKeys(cryptographer->has_pending_keys());
1624 allstatus_.SetEncryptedTypes(cryptographer->GetEncryptedTypes()); 1615 allstatus_.SetEncryptedTypes(cryptographer->GetEncryptedTypes());
1625
1626 // If everything is in order(we have the passphrase) then there is no
1627 // need to inform the listeners. They will just wait for sync
1628 // completion event and if no errors have been raised it means
1629 // encryption was succesful.
1630 } 1616 }
1631 1617
1632 if (!initialized_) { 1618 if (!initialized_) {
1633 LOG(INFO) << "OnSyncCycleCompleted not sent because sync api is not " 1619 LOG(INFO) << "OnSyncCycleCompleted not sent because sync api is not "
1634 << "initialized"; 1620 << "initialized";
1635 return; 1621 return;
1636 } 1622 }
1637 1623
1638 if (!event.snapshot->has_more_to_sync) { 1624 if (!event.snapshot->has_more_to_sync) {
1639 VLOG(1) << "OnSyncCycleCompleted sent"; 1625 VLOG(1) << "Sending OnSyncCycleCompleted";
1640 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, 1626 FOR_EACH_OBSERVER(SyncManager::Observer, observers_,
1641 OnSyncCycleCompleted(event.snapshot)); 1627 OnSyncCycleCompleted(event.snapshot));
1642 } 1628 }
1643 1629
1644 // This is here for tests, which are still using p2p notifications. 1630 // This is here for tests, which are still using p2p notifications.
1645 // 1631 //
1646 // TODO(chron): Consider changing this back to track has_more_to_sync 1632 // TODO(chron): Consider changing this back to track has_more_to_sync
1647 // only notify peers if a successful commit has occurred. 1633 // only notify peers if a successful commit has occurred.
1648 bool is_notifiable_commit = 1634 bool is_notifiable_commit =
1649 (event.snapshot->syncer_status.num_successful_commits > 0); 1635 (event.snapshot->syncer_status.num_successful_commits > 0);
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after
1869 entry_kernels.begin(); it != entry_kernels.end(); ++it) { 1855 entry_kernels.begin(); it != entry_kernels.end(); ++it) {
1870 if ((*it)->ContainsString(lowercase_query)) { 1856 if ((*it)->ContainsString(lowercase_query)) {
1871 result->Append(new StringValue(base::Int64ToString( 1857 result->Append(new StringValue(base::Int64ToString(
1872 (*it)->ref(syncable::META_HANDLE)))); 1858 (*it)->ref(syncable::META_HANDLE))));
1873 } 1859 }
1874 } 1860 }
1875 1861
1876 return JsArgList(&return_args); 1862 return JsArgList(&return_args);
1877 } 1863 }
1878 1864
1865 void SyncManager::SyncInternal::OnEncryptedTypesChanged(
1866 const syncable::ModelTypeSet& encrypted_types,
1867 bool encrypt_everything) {
1868 // NOTE: We're in a transaction.
1869 FOR_EACH_OBSERVER(
1870 SyncManager::Observer, observers_,
1871 OnEncryptedTypesChanged(encrypted_types, encrypt_everything));
1872 }
1873
1879 void SyncManager::SyncInternal::OnNotificationStateChange( 1874 void SyncManager::SyncInternal::OnNotificationStateChange(
1880 bool notifications_enabled) { 1875 bool notifications_enabled) {
1881 VLOG(1) << "P2P: Notifications enabled = " 1876 VLOG(1) << "P2P: Notifications enabled = "
1882 << (notifications_enabled ? "true" : "false"); 1877 << (notifications_enabled ? "true" : "false");
1883 allstatus_.SetNotificationsEnabled(notifications_enabled); 1878 allstatus_.SetNotificationsEnabled(notifications_enabled);
1884 if (scheduler()) { 1879 if (scheduler()) {
1885 scheduler()->set_notifications_enabled(notifications_enabled); 1880 scheduler()->set_notifications_enabled(notifications_enabled);
1886 } 1881 }
1887 if (js_event_handler_.IsInitialized()) { 1882 if (js_event_handler_.IsInitialized()) {
1888 DictionaryValue details; 1883 DictionaryValue details;
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
1997 lookup->SaveChanges(); 1992 lookup->SaveChanges();
1998 } 1993 }
1999 1994
2000 UserShare* SyncManager::GetUserShare() const { 1995 UserShare* SyncManager::GetUserShare() const {
2001 return data_->GetUserShare(); 1996 return data_->GetUserShare();
2002 } 1997 }
2003 1998
2004 void SyncManager::RefreshEncryption() { 1999 void SyncManager::RefreshEncryption() {
2005 DCHECK(thread_checker_.CalledOnValidThread()); 2000 DCHECK(thread_checker_.CalledOnValidThread());
2006 if (data_->UpdateCryptographerFromNigori()) 2001 if (data_->UpdateCryptographerFromNigori())
2007 data_->EncryptDataTypes(syncable::ModelTypeSet()); 2002 data_->RefreshEncryption();
2008 } 2003 }
2009 2004
2010 syncable::ModelTypeSet SyncManager::GetEncryptedDataTypes() const { 2005 syncable::ModelTypeSet SyncManager::GetEncryptedDataTypesForTest() const {
2011 ReadTransaction trans(FROM_HERE, GetUserShare()); 2006 ReadTransaction trans(FROM_HERE, GetUserShare());
2012 return GetEncryptedTypes(&trans); 2007 return GetEncryptedTypes(&trans);
2013 } 2008 }
2014 2009
2015 bool SyncManager::ReceivedExperimentalTypes(syncable::ModelTypeSet* to_add) 2010 bool SyncManager::ReceivedExperimentalTypes(syncable::ModelTypeSet* to_add)
2016 const { 2011 const {
2017 ReadTransaction trans(FROM_HERE, GetUserShare()); 2012 ReadTransaction trans(FROM_HERE, GetUserShare());
2018 ReadNode node(&trans); 2013 ReadNode node(&trans);
2019 if (!node.InitByTagLookup(kNigoriTag)) { 2014 if (!node.InitByTagLookup(kNigoriTag)) {
2020 VLOG(1) << "Couldn't find Nigori node."; 2015 VLOG(1) << "Couldn't find Nigori node.";
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
2078 2073
2079 for (syncable::ModelTypeSet::const_iterator i = types.begin(); 2074 for (syncable::ModelTypeSet::const_iterator i = types.begin();
2080 i != types.end(); ++i) { 2075 i != types.end(); ++i) {
2081 if (!lookup->initial_sync_ended_for_type(*i)) 2076 if (!lookup->initial_sync_ended_for_type(*i))
2082 return false; 2077 return false;
2083 } 2078 }
2084 return true; 2079 return true;
2085 } 2080 }
2086 2081
2087 } // namespace sync_api 2082 } // namespace sync_api
OLDNEW
« no previous file with comments | « chrome/browser/sync/internal_api/sync_manager.h ('k') | chrome/browser/sync/internal_api/syncapi_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698