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