OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "build/build_config.h" | 5 #include "build/build_config.h" |
6 | 6 |
7 #include "chrome/browser/sync/glue/sync_backend_host.h" | 7 #include "chrome/browser/sync/glue/sync_backend_host.h" |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 #include <map> | 10 #include <map> |
(...skipping 30 matching lines...) Expand all Loading... |
41 #include "jingle/notifier/base/notifier_options.h" | 41 #include "jingle/notifier/base/notifier_options.h" |
42 #include "net/base/host_port_pair.h" | 42 #include "net/base/host_port_pair.h" |
43 #include "net/url_request/url_request_context_getter.h" | 43 #include "net/url_request/url_request_context_getter.h" |
44 #include "sync/internal_api/public/base_transaction.h" | 44 #include "sync/internal_api/public/base_transaction.h" |
45 #include "sync/internal_api/public/engine/model_safe_worker.h" | 45 #include "sync/internal_api/public/engine/model_safe_worker.h" |
46 #include "sync/internal_api/public/http_bridge.h" | 46 #include "sync/internal_api/public/http_bridge.h" |
47 #include "sync/internal_api/public/internal_components_factory_impl.h" | 47 #include "sync/internal_api/public/internal_components_factory_impl.h" |
48 #include "sync/internal_api/public/read_transaction.h" | 48 #include "sync/internal_api/public/read_transaction.h" |
49 #include "sync/internal_api/public/sync_manager_factory.h" | 49 #include "sync/internal_api/public/sync_manager_factory.h" |
50 #include "sync/internal_api/public/util/experiments.h" | 50 #include "sync/internal_api/public/util/experiments.h" |
| 51 #include "sync/internal_api/public/util/sync_string_conversions.h" |
51 #include "sync/notifier/sync_notifier.h" | 52 #include "sync/notifier/sync_notifier.h" |
52 #include "sync/protocol/encryption.pb.h" | 53 #include "sync/protocol/encryption.pb.h" |
53 #include "sync/protocol/sync.pb.h" | 54 #include "sync/protocol/sync.pb.h" |
54 #include "sync/util/nigori.h" | 55 #include "sync/util/nigori.h" |
55 | 56 |
56 static const int kSaveChangesIntervalSeconds = 10; | 57 static const int kSaveChangesIntervalSeconds = 10; |
57 static const FilePath::CharType kSyncDataFolderName[] = | 58 static const FilePath::CharType kSyncDataFolderName[] = |
58 FILE_PATH_LITERAL("Sync Data"); | 59 FILE_PATH_LITERAL("Sync Data"); |
59 | 60 |
60 typedef TokenService::TokenAvailableDetails TokenAvailableDetails; | 61 typedef TokenService::TokenAvailableDetails TokenAvailableDetails; |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
108 const sync_pb::EncryptedData& pending_keys) OVERRIDE; | 109 const sync_pb::EncryptedData& pending_keys) OVERRIDE; |
109 virtual void OnPassphraseAccepted() OVERRIDE; | 110 virtual void OnPassphraseAccepted() OVERRIDE; |
110 virtual void OnBootstrapTokenUpdated( | 111 virtual void OnBootstrapTokenUpdated( |
111 const std::string& bootstrap_token) OVERRIDE; | 112 const std::string& bootstrap_token) OVERRIDE; |
112 virtual void OnEncryptedTypesChanged( | 113 virtual void OnEncryptedTypesChanged( |
113 syncer::ModelTypeSet encrypted_types, | 114 syncer::ModelTypeSet encrypted_types, |
114 bool encrypt_everything) OVERRIDE; | 115 bool encrypt_everything) OVERRIDE; |
115 virtual void OnEncryptionComplete() OVERRIDE; | 116 virtual void OnEncryptionComplete() OVERRIDE; |
116 virtual void OnCryptographerStateChanged( | 117 virtual void OnCryptographerStateChanged( |
117 syncer::Cryptographer* cryptographer) OVERRIDE; | 118 syncer::Cryptographer* cryptographer) OVERRIDE; |
| 119 virtual void OnPassphraseStateChanged(syncer::PassphraseState state) OVERRIDE; |
118 | 120 |
119 // syncer::SyncNotifierObserver implementation. | 121 // syncer::SyncNotifierObserver implementation. |
120 virtual void OnNotificationsEnabled() OVERRIDE; | 122 virtual void OnNotificationsEnabled() OVERRIDE; |
121 virtual void OnNotificationsDisabled( | 123 virtual void OnNotificationsDisabled( |
122 syncer::NotificationsDisabledReason reason) OVERRIDE; | 124 syncer::NotificationsDisabledReason reason) OVERRIDE; |
123 virtual void OnIncomingNotification( | 125 virtual void OnIncomingNotification( |
124 const syncer::ObjectIdStateMap& id_state_map, | 126 const syncer::ObjectIdStateMap& id_state_map, |
125 syncer::IncomingNotificationSource source) OVERRIDE; | 127 syncer::IncomingNotificationSource source) OVERRIDE; |
126 | 128 |
127 // Note: | 129 // Note: |
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
318 name_(name), | 320 name_(name), |
319 core_(new Core(name, profile_->GetPath().Append(kSyncDataFolderName), | 321 core_(new Core(name, profile_->GetPath().Append(kSyncDataFolderName), |
320 weak_ptr_factory_.GetWeakPtr())), | 322 weak_ptr_factory_.GetWeakPtr())), |
321 initialization_state_(NOT_ATTEMPTED), | 323 initialization_state_(NOT_ATTEMPTED), |
322 sync_prefs_(sync_prefs), | 324 sync_prefs_(sync_prefs), |
323 sync_notifier_factory_( | 325 sync_notifier_factory_( |
324 ParseNotifierOptions(*CommandLine::ForCurrentProcess(), | 326 ParseNotifierOptions(*CommandLine::ForCurrentProcess(), |
325 profile_->GetRequestContext()), | 327 profile_->GetRequestContext()), |
326 content::GetUserAgent(GURL()), | 328 content::GetUserAgent(GURL()), |
327 invalidator_storage), | 329 invalidator_storage), |
328 frontend_(NULL) { | 330 frontend_(NULL), |
| 331 cached_passphrase_state_(syncer::IMPLICIT_PASSPHRASE) { |
329 } | 332 } |
330 | 333 |
331 SyncBackendHost::SyncBackendHost(Profile* profile) | 334 SyncBackendHost::SyncBackendHost(Profile* profile) |
332 : weak_ptr_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), | 335 : weak_ptr_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), |
333 sync_thread_("Chrome_SyncThread"), | 336 sync_thread_("Chrome_SyncThread"), |
334 frontend_loop_(MessageLoop::current()), | 337 frontend_loop_(MessageLoop::current()), |
335 profile_(profile), | 338 profile_(profile), |
336 name_("Unknown"), | 339 name_("Unknown"), |
337 initialization_state_(NOT_ATTEMPTED), | 340 initialization_state_(NOT_ATTEMPTED), |
338 sync_notifier_factory_( | 341 sync_notifier_factory_( |
339 ParseNotifierOptions(*CommandLine::ForCurrentProcess(), | 342 ParseNotifierOptions(*CommandLine::ForCurrentProcess(), |
340 profile_->GetRequestContext()), | 343 profile_->GetRequestContext()), |
341 content::GetUserAgent(GURL()), | 344 content::GetUserAgent(GURL()), |
342 base::WeakPtr<syncer::InvalidationStateTracker>()), | 345 base::WeakPtr<syncer::InvalidationStateTracker>()), |
343 frontend_(NULL) { | 346 frontend_(NULL), |
| 347 cached_passphrase_state_(syncer::IMPLICIT_PASSPHRASE) { |
344 } | 348 } |
345 | 349 |
346 SyncBackendHost::~SyncBackendHost() { | 350 SyncBackendHost::~SyncBackendHost() { |
347 DCHECK(!core_ && !frontend_) << "Must call Shutdown before destructor."; | 351 DCHECK(!core_ && !frontend_) << "Must call Shutdown before destructor."; |
348 DCHECK(!chrome_sync_notification_bridge_.get()); | 352 DCHECK(!chrome_sync_notification_bridge_.get()); |
349 DCHECK(!registrar_.get()); | 353 DCHECK(!registrar_.get()); |
350 } | 354 } |
351 | 355 |
352 namespace { | 356 namespace { |
353 | 357 |
(...skipping 401 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
755 | 759 |
756 bool SyncBackendHost::IsNigoriEnabled() const { | 760 bool SyncBackendHost::IsNigoriEnabled() const { |
757 return registrar_.get() && registrar_->IsNigoriEnabled(); | 761 return registrar_.get() && registrar_->IsNigoriEnabled(); |
758 } | 762 } |
759 | 763 |
760 bool SyncBackendHost::IsUsingExplicitPassphrase() { | 764 bool SyncBackendHost::IsUsingExplicitPassphrase() { |
761 // This should only be called once the nigori node has been downloaded, as | 765 // This should only be called once the nigori node has been downloaded, as |
762 // otherwise we have no idea what kind of passphrase we are using. This will | 766 // otherwise we have no idea what kind of passphrase we are using. This will |
763 // NOTREACH in sync_manager and return false if we fail to load the nigori | 767 // NOTREACH in sync_manager and return false if we fail to load the nigori |
764 // node. | 768 // node. |
765 // TODO(zea): cache this value here, then make the encryption handler | 769 // TODO(zea): expose whether the custom passphrase is a frozen implicit |
766 // NonThreadSafe and only accessible from the sync thread. | 770 // passphrase or not to provide better messaging. |
767 return IsNigoriEnabled() && | 771 return IsNigoriEnabled() && ( |
768 core_->sync_manager()->GetEncryptionHandler()-> | 772 cached_passphrase_state_ == syncer::CUSTOM_PASSPHRASE || |
769 IsUsingExplicitPassphrase(); | 773 cached_passphrase_state_ == syncer::FROZEN_IMPLICIT_PASSPHRASE); |
770 } | 774 } |
771 | 775 |
772 bool SyncBackendHost::IsCryptographerReady( | 776 bool SyncBackendHost::IsCryptographerReady( |
773 const syncer::BaseTransaction* trans) const { | 777 const syncer::BaseTransaction* trans) const { |
774 return initialized() && trans->GetCryptographer()->is_ready(); | 778 return initialized() && trans->GetCryptographer()->is_ready(); |
775 } | 779 } |
776 | 780 |
777 void SyncBackendHost::GetModelSafeRoutingInfo( | 781 void SyncBackendHost::GetModelSafeRoutingInfo( |
778 syncer::ModelSafeRoutingInfo* out) const { | 782 syncer::ModelSafeRoutingInfo* out) const { |
779 if (initialized()) { | 783 if (initialized()) { |
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1018 host_.Call( | 1022 host_.Call( |
1019 FROM_HERE, | 1023 FROM_HERE, |
1020 &SyncBackendHost::NotifyEncryptionComplete); | 1024 &SyncBackendHost::NotifyEncryptionComplete); |
1021 } | 1025 } |
1022 | 1026 |
1023 void SyncBackendHost::Core::OnCryptographerStateChanged( | 1027 void SyncBackendHost::Core::OnCryptographerStateChanged( |
1024 syncer::Cryptographer* cryptographer) { | 1028 syncer::Cryptographer* cryptographer) { |
1025 // Do nothing. | 1029 // Do nothing. |
1026 } | 1030 } |
1027 | 1031 |
| 1032 void SyncBackendHost::Core::OnPassphraseStateChanged( |
| 1033 syncer::PassphraseState state) { |
| 1034 host_.Call( |
| 1035 FROM_HERE, |
| 1036 &SyncBackendHost::HandlePassphraseStateChangedOnFrontendLoop, |
| 1037 state); |
| 1038 } |
| 1039 |
1028 void SyncBackendHost::Core::OnActionableError( | 1040 void SyncBackendHost::Core::OnActionableError( |
1029 const syncer::SyncProtocolError& sync_error) { | 1041 const syncer::SyncProtocolError& sync_error) { |
1030 if (!sync_loop_) | 1042 if (!sync_loop_) |
1031 return; | 1043 return; |
1032 DCHECK_EQ(MessageLoop::current(), sync_loop_); | 1044 DCHECK_EQ(MessageLoop::current(), sync_loop_); |
1033 host_.Call( | 1045 host_.Call( |
1034 FROM_HERE, | 1046 FROM_HERE, |
1035 &SyncBackendHost::HandleActionableErrorEventOnFrontendLoop, | 1047 &SyncBackendHost::HandleActionableErrorEventOnFrontendLoop, |
1036 sync_error); | 1048 sync_error); |
1037 } | 1049 } |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1159 const syncer::ModelSafeRoutingInfo& routing_info) { | 1171 const syncer::ModelSafeRoutingInfo& routing_info) { |
1160 DCHECK_EQ(MessageLoop::current(), sync_loop_); | 1172 DCHECK_EQ(MessageLoop::current(), sync_loop_); |
1161 sync_manager_->StartSyncingNormally(routing_info); | 1173 sync_manager_->StartSyncingNormally(routing_info); |
1162 } | 1174 } |
1163 | 1175 |
1164 void SyncBackendHost::Core::DoAssociateNigori() { | 1176 void SyncBackendHost::Core::DoAssociateNigori() { |
1165 DCHECK_EQ(MessageLoop::current(), sync_loop_); | 1177 DCHECK_EQ(MessageLoop::current(), sync_loop_); |
1166 sync_manager_->GetEncryptionHandler()->AddObserver(this); | 1178 sync_manager_->GetEncryptionHandler()->AddObserver(this); |
1167 sync_manager_->GetEncryptionHandler()->Init(); | 1179 sync_manager_->GetEncryptionHandler()->Init(); |
1168 host_.Call(FROM_HERE, | 1180 host_.Call(FROM_HERE, |
| 1181 &SyncBackendHost::HandlePassphraseStateChangedOnFrontendLoop, |
| 1182 sync_manager_->GetEncryptionHandler()->GetPassphraseState()); |
| 1183 host_.Call(FROM_HERE, |
1169 &SyncBackendHost::HandleInitializationCompletedOnFrontendLoop, | 1184 &SyncBackendHost::HandleInitializationCompletedOnFrontendLoop, |
1170 true); | 1185 true); |
1171 } | 1186 } |
1172 | 1187 |
1173 void SyncBackendHost::Core::DoSetEncryptionPassphrase( | 1188 void SyncBackendHost::Core::DoSetEncryptionPassphrase( |
1174 const std::string& passphrase, | 1189 const std::string& passphrase, |
1175 bool is_explicit) { | 1190 bool is_explicit) { |
1176 DCHECK_EQ(MessageLoop::current(), sync_loop_); | 1191 DCHECK_EQ(MessageLoop::current(), sync_loop_); |
1177 sync_manager_->GetEncryptionHandler()->SetEncryptionPassphrase( | 1192 sync_manager_->GetEncryptionHandler()->SetEncryptionPassphrase( |
1178 passphrase, is_explicit); | 1193 passphrase, is_explicit); |
(...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1512 } | 1527 } |
1513 | 1528 |
1514 void SyncBackendHost::NotifyEncryptionComplete() { | 1529 void SyncBackendHost::NotifyEncryptionComplete() { |
1515 if (!frontend_) | 1530 if (!frontend_) |
1516 return; | 1531 return; |
1517 | 1532 |
1518 DCHECK_EQ(MessageLoop::current(), frontend_loop_); | 1533 DCHECK_EQ(MessageLoop::current(), frontend_loop_); |
1519 frontend_->OnEncryptionComplete(); | 1534 frontend_->OnEncryptionComplete(); |
1520 } | 1535 } |
1521 | 1536 |
| 1537 void SyncBackendHost::HandlePassphraseStateChangedOnFrontendLoop( |
| 1538 syncer::PassphraseState state) { |
| 1539 DCHECK_EQ(MessageLoop::current(), frontend_loop_); |
| 1540 DVLOG(1) << "Passphrase state changed to " |
| 1541 << syncer::PassphraseStateToString(state); |
| 1542 cached_passphrase_state_ = state; |
| 1543 } |
| 1544 |
1522 void SyncBackendHost::HandleStopSyncingPermanentlyOnFrontendLoop() { | 1545 void SyncBackendHost::HandleStopSyncingPermanentlyOnFrontendLoop() { |
1523 if (!frontend_) | 1546 if (!frontend_) |
1524 return; | 1547 return; |
1525 frontend_->OnStopSyncingPermanently(); | 1548 frontend_->OnStopSyncingPermanently(); |
1526 } | 1549 } |
1527 | 1550 |
1528 void SyncBackendHost::HandleConnectionStatusChangeOnFrontendLoop( | 1551 void SyncBackendHost::HandleConnectionStatusChangeOnFrontendLoop( |
1529 syncer::ConnectionStatus status) { | 1552 syncer::ConnectionStatus status) { |
1530 if (!frontend_) | 1553 if (!frontend_) |
1531 return; | 1554 return; |
1532 | 1555 |
1533 DCHECK_EQ(MessageLoop::current(), frontend_loop_); | 1556 DCHECK_EQ(MessageLoop::current(), frontend_loop_); |
1534 | 1557 |
1535 frontend_->OnConnectionStatusChange(status); | 1558 frontend_->OnConnectionStatusChange(status); |
1536 } | 1559 } |
1537 | 1560 |
1538 void SyncBackendHost::HandleNigoriConfigurationCompletedOnFrontendLoop( | 1561 void SyncBackendHost::HandleNigoriConfigurationCompletedOnFrontendLoop( |
1539 const syncer::ModelTypeSet failed_configuration_types) { | 1562 const syncer::ModelTypeSet failed_configuration_types) { |
1540 HandleInitializationCompletedOnFrontendLoop( | 1563 HandleInitializationCompletedOnFrontendLoop( |
1541 failed_configuration_types.Empty()); | 1564 failed_configuration_types.Empty()); |
1542 } | 1565 } |
1543 | 1566 |
1544 #undef SDVLOG | 1567 #undef SDVLOG |
1545 | 1568 |
1546 #undef SLOG | 1569 #undef SLOG |
1547 | 1570 |
1548 } // namespace browser_sync | 1571 } // namespace browser_sync |
OLD | NEW |