OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 "build/build_config.h" | 7 #include "build/build_config.h" |
8 | 8 |
9 #include <iomanip> | 9 #include <iomanip> |
10 #include <list> | 10 #include <list> |
11 #include <string> | 11 #include <string> |
12 #include <vector> | 12 #include <vector> |
13 | 13 |
14 #include "base/basictypes.h" | 14 #include "base/basictypes.h" |
15 #include "base/base64.h" | 15 #include "base/base64.h" |
16 #include "base/lock.h" | 16 #include "base/lock.h" |
17 #include "base/logging.h" | 17 #include "base/logging.h" |
18 #include "base/message_loop.h" | 18 #include "base/message_loop.h" |
19 #include "base/platform_thread.h" | 19 #include "base/platform_thread.h" |
20 #include "base/scoped_ptr.h" | 20 #include "base/scoped_ptr.h" |
21 #include "base/sha1.h" | 21 #include "base/sha1.h" |
22 #include "base/string_util.h" | 22 #include "base/string_util.h" |
23 #include "base/task.h" | 23 #include "base/task.h" |
24 #include "base/utf_string_conversions.h" | 24 #include "base/utf_string_conversions.h" |
25 #include "chrome/browser/browser_process.h" | 25 #include "chrome/browser/browser_process.h" |
26 #include "chrome/browser/sync/sync_constants.h" | 26 #include "chrome/browser/sync/sync_constants.h" |
27 #include "chrome/browser/sync/engine/all_status.h" | 27 #include "chrome/browser/sync/engine/all_status.h" |
28 #include "chrome/browser/sync/engine/auth_watcher.h" | |
29 #include "chrome/browser/sync/engine/change_reorder_buffer.h" | 28 #include "chrome/browser/sync/engine/change_reorder_buffer.h" |
30 #include "chrome/browser/sync/engine/model_safe_worker.h" | 29 #include "chrome/browser/sync/engine/model_safe_worker.h" |
31 #include "chrome/browser/sync/engine/net/server_connection_manager.h" | 30 #include "chrome/browser/sync/engine/net/server_connection_manager.h" |
32 #include "chrome/browser/sync/engine/net/syncapi_server_connection_manager.h" | 31 #include "chrome/browser/sync/engine/net/syncapi_server_connection_manager.h" |
33 #include "chrome/browser/sync/engine/syncer.h" | 32 #include "chrome/browser/sync/engine/syncer.h" |
34 #include "chrome/browser/sync/engine/syncer_thread.h" | 33 #include "chrome/browser/sync/engine/syncer_thread.h" |
35 #include "chrome/browser/sync/notifier/server_notifier_thread.h" | 34 #include "chrome/browser/sync/notifier/server_notifier_thread.h" |
36 #include "chrome/browser/sync/protocol/app_specifics.pb.h" | 35 #include "chrome/browser/sync/protocol/app_specifics.pb.h" |
37 #include "chrome/browser/sync/protocol/autofill_specifics.pb.h" | 36 #include "chrome/browser/sync/protocol/autofill_specifics.pb.h" |
38 #include "chrome/browser/sync/protocol/bookmark_specifics.pb.h" | 37 #include "chrome/browser/sync/protocol/bookmark_specifics.pb.h" |
39 #include "chrome/browser/sync/protocol/extension_specifics.pb.h" | 38 #include "chrome/browser/sync/protocol/extension_specifics.pb.h" |
40 #include "chrome/browser/sync/protocol/nigori_specifics.pb.h" | 39 #include "chrome/browser/sync/protocol/nigori_specifics.pb.h" |
41 #include "chrome/browser/sync/protocol/password_specifics.pb.h" | 40 #include "chrome/browser/sync/protocol/password_specifics.pb.h" |
42 #include "chrome/browser/sync/protocol/preference_specifics.pb.h" | 41 #include "chrome/browser/sync/protocol/preference_specifics.pb.h" |
43 #include "chrome/browser/sync/protocol/session_specifics.pb.h" | 42 #include "chrome/browser/sync/protocol/session_specifics.pb.h" |
44 #include "chrome/browser/sync/protocol/service_constants.h" | 43 #include "chrome/browser/sync/protocol/service_constants.h" |
45 #include "chrome/browser/sync/protocol/sync.pb.h" | 44 #include "chrome/browser/sync/protocol/sync.pb.h" |
46 #include "chrome/browser/sync/protocol/theme_specifics.pb.h" | 45 #include "chrome/browser/sync/protocol/theme_specifics.pb.h" |
47 #include "chrome/browser/sync/protocol/typed_url_specifics.pb.h" | 46 #include "chrome/browser/sync/protocol/typed_url_specifics.pb.h" |
48 #include "chrome/browser/sync/sessions/sync_session_context.h" | 47 #include "chrome/browser/sync/sessions/sync_session_context.h" |
49 #include "chrome/browser/sync/syncable/directory_manager.h" | 48 #include "chrome/browser/sync/syncable/directory_manager.h" |
50 #include "chrome/browser/sync/syncable/syncable.h" | 49 #include "chrome/browser/sync/syncable/syncable.h" |
51 #include "chrome/browser/sync/util/crypto_helpers.h" | 50 #include "chrome/browser/sync/util/crypto_helpers.h" |
52 #include "chrome/browser/sync/util/user_settings.h" | |
53 #include "chrome/common/chrome_switches.h" | 51 #include "chrome/common/chrome_switches.h" |
54 #include "chrome/common/deprecated/event_sys.h" | 52 #include "chrome/common/deprecated/event_sys.h" |
55 #include "chrome/common/net/gaia/gaia_authenticator.h" | 53 #include "chrome/common/net/gaia/gaia_authenticator.h" |
56 #include "jingle/notifier/listener/mediator_thread_impl.h" | 54 #include "jingle/notifier/listener/mediator_thread_impl.h" |
57 #include "jingle/notifier/listener/notification_constants.h" | 55 #include "jingle/notifier/listener/notification_constants.h" |
58 #include "jingle/notifier/listener/talk_mediator.h" | 56 #include "jingle/notifier/listener/talk_mediator.h" |
59 #include "jingle/notifier/listener/talk_mediator_impl.h" | 57 #include "jingle/notifier/listener/talk_mediator_impl.h" |
60 #include "net/base/network_change_notifier.h" | 58 #include "net/base/network_change_notifier.h" |
61 | 59 |
62 using browser_sync::AllStatus; | 60 using browser_sync::AllStatus; |
63 using browser_sync::AllStatusEvent; | 61 using browser_sync::AllStatusEvent; |
64 using browser_sync::AuthWatcher; | |
65 using browser_sync::AuthWatcherEvent; | |
66 using browser_sync::Cryptographer; | 62 using browser_sync::Cryptographer; |
67 using browser_sync::KeyParams; | 63 using browser_sync::KeyParams; |
68 using browser_sync::ModelSafeRoutingInfo; | 64 using browser_sync::ModelSafeRoutingInfo; |
69 using browser_sync::ModelSafeWorker; | 65 using browser_sync::ModelSafeWorker; |
70 using browser_sync::ModelSafeWorkerRegistrar; | 66 using browser_sync::ModelSafeWorkerRegistrar; |
| 67 using browser_sync::ServerConnectionEvent; |
71 using browser_sync::Syncer; | 68 using browser_sync::Syncer; |
72 using browser_sync::SyncerEvent; | 69 using browser_sync::SyncerEvent; |
73 using browser_sync::SyncerThread; | 70 using browser_sync::SyncerThread; |
74 using browser_sync::UserSettings; | |
75 using browser_sync::kNigoriTag; | 71 using browser_sync::kNigoriTag; |
76 using browser_sync::sessions::SyncSessionContext; | 72 using browser_sync::sessions::SyncSessionContext; |
77 using notifier::TalkMediator; | 73 using notifier::TalkMediator; |
78 using notifier::TalkMediatorImpl; | 74 using notifier::TalkMediatorImpl; |
79 using std::list; | 75 using std::list; |
80 using std::hex; | 76 using std::hex; |
81 using std::string; | 77 using std::string; |
82 using std::vector; | 78 using std::vector; |
83 using syncable::Directory; | 79 using syncable::Directory; |
84 using syncable::DirectoryManager; | 80 using syncable::DirectoryManager; |
(...skipping 818 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
903 : public net::NetworkChangeNotifier::Observer, | 899 : public net::NetworkChangeNotifier::Observer, |
904 public TalkMediator::Delegate, | 900 public TalkMediator::Delegate, |
905 public browser_sync::ChannelEventHandler<syncable::DirectoryChangeEvent>, | 901 public browser_sync::ChannelEventHandler<syncable::DirectoryChangeEvent>, |
906 public browser_sync::ChannelEventHandler<SyncerEvent>{ | 902 public browser_sync::ChannelEventHandler<SyncerEvent>{ |
907 static const int kDefaultNudgeDelayMilliseconds; | 903 static const int kDefaultNudgeDelayMilliseconds; |
908 static const int kPreferencesNudgeDelayMilliseconds; | 904 static const int kPreferencesNudgeDelayMilliseconds; |
909 public: | 905 public: |
910 explicit SyncInternal(SyncManager* sync_manager) | 906 explicit SyncInternal(SyncManager* sync_manager) |
911 : core_message_loop_(NULL), | 907 : core_message_loop_(NULL), |
912 observer_(NULL), | 908 observer_(NULL), |
913 auth_problem_(AuthError::NONE), | |
914 sync_manager_(sync_manager), | 909 sync_manager_(sync_manager), |
915 registrar_(NULL), | 910 registrar_(NULL), |
916 notification_pending_(false), | 911 notification_pending_(false), |
917 initialized_(false), | 912 initialized_(false), |
918 use_chrome_async_socket_(false), | 913 use_chrome_async_socket_(false), |
919 notification_method_(browser_sync::kDefaultNotificationMethod), | 914 notification_method_(browser_sync::kDefaultNotificationMethod), |
920 ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)) { | 915 ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)) { |
921 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI)); | 916 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI)); |
922 } | 917 } |
923 | 918 |
924 ~SyncInternal() { | 919 ~SyncInternal() { |
925 DCHECK(!core_message_loop_); | 920 DCHECK(!core_message_loop_); |
926 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI)); | 921 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI)); |
927 } | 922 } |
928 | 923 |
929 bool Init(const FilePath& database_location, | 924 bool Init(const FilePath& database_location, |
930 const std::string& sync_server_and_path, | 925 const std::string& sync_server_and_path, |
931 int port, | 926 int port, |
932 const char* gaia_service_id, | |
933 const char* gaia_source, | |
934 bool use_ssl, | 927 bool use_ssl, |
935 HttpPostProviderFactory* post_factory, | 928 HttpPostProviderFactory* post_factory, |
936 HttpPostProviderFactory* auth_post_factory, | |
937 ModelSafeWorkerRegistrar* model_safe_worker_registrar, | 929 ModelSafeWorkerRegistrar* model_safe_worker_registrar, |
938 bool attempt_last_user_authentication, | |
939 bool invalidate_last_user_auth_token, | |
940 bool invalidate_xmpp_auth_token, | |
941 const char* user_agent, | 930 const char* user_agent, |
942 const std::string& lsid, | 931 const SyncCredentials& credentials, |
943 const bool use_chrome_async_socket, | 932 const bool use_chrome_async_socket, |
944 const bool try_ssltcp_first, | 933 const bool try_ssltcp_first, |
945 browser_sync::NotificationMethod notification_method, | 934 browser_sync::NotificationMethod notification_method, |
946 const std::string& restored_key_for_bootstrapping); | 935 const std::string& restored_key_for_bootstrapping); |
947 | 936 |
948 // Tell sync engine to submit credentials to GAIA for verification. | 937 |
949 // Successful GAIA authentication will kick off the following chain of events: | 938 // Sign into sync with given credentials. |
950 // 1. Cause sync engine to open the syncer database. | 939 // We do not verify the tokens given. After this call, the tokens are set |
951 // 2. Trigger the AuthWatcher to create a Syncer for the directory and call | 940 // and the sync DB is open. True if successful, false if something |
952 // SyncerThread::SyncDirectory; the SyncerThread will block until (4). | 941 // went wrong. |
953 // 3. Tell the ServerConnectionManager to pass the newly received GAIA auth | 942 bool SignIn(const SyncCredentials& credentials); |
954 // token to a sync server to obtain a sync token. | 943 |
955 // 4. On receipt of this token, the ServerConnectionManager broadcasts | 944 // Update tokens that we're using in Sync. Email must stay the same. |
956 // a server-reachable event, which will unblock the SyncerThread. | 945 void UpdateCredentials(const SyncCredentials& credentials); |
957 // 5. When StartSyncing is called, the Syncer will begin the sync process, by | |
958 // downloading from or uploading to the server. | |
959 // | |
960 // If authentication fails, an event will be broadcast all the way up to | |
961 // the SyncManager::Observer. It may, in turn, decide to try again with new | |
962 // credentials. Calling this method again is the appropriate course of action | |
963 // to "retry". | |
964 void Authenticate(const std::string& username, const std::string& password, | |
965 const std::string& captcha); | |
966 | 946 |
967 // Tell the sync engine to start the syncing process. | 947 // Tell the sync engine to start the syncing process. |
968 void StartSyncing(); | 948 void StartSyncing(); |
969 | 949 |
970 void SetPassphrase(const std::string& passphrase); | 950 void SetPassphrase(const std::string& passphrase); |
971 | 951 |
972 // Call periodically from a database-safe thread to persist recent changes | 952 // Call periodically from a database-safe thread to persist recent changes |
973 // to the syncapi model. | 953 // to the syncapi model. |
974 void SaveChanges(); | 954 void SaveChanges(); |
975 | 955 |
976 // This listener is called upon completion of a syncable transaction, and | 956 // This listener is called upon completion of a syncable transaction, and |
977 // builds the list of sync-engine initiated changes that will be forwarded to | 957 // builds the list of sync-engine initiated changes that will be forwarded to |
978 // the SyncManager's Observers. | 958 // the SyncManager's Observers. |
979 virtual void HandleChannelEvent(const syncable::DirectoryChangeEvent& event); | 959 virtual void HandleChannelEvent(const syncable::DirectoryChangeEvent& event); |
980 void HandleTransactionEndingChangeEvent( | 960 void HandleTransactionEndingChangeEvent( |
981 const syncable::DirectoryChangeEvent& event); | 961 const syncable::DirectoryChangeEvent& event); |
982 void HandleCalculateChangesChangeEventFromSyncApi( | 962 void HandleCalculateChangesChangeEventFromSyncApi( |
983 const syncable::DirectoryChangeEvent& event); | 963 const syncable::DirectoryChangeEvent& event); |
984 void HandleCalculateChangesChangeEventFromSyncer( | 964 void HandleCalculateChangesChangeEventFromSyncer( |
985 const syncable::DirectoryChangeEvent& event); | 965 const syncable::DirectoryChangeEvent& event); |
986 | 966 |
987 // This listener is called by the syncer channel for all syncer events. | 967 // This listener is called by the syncer channel for all syncer events. |
988 virtual void HandleChannelEvent(const SyncerEvent& event); | 968 virtual void HandleChannelEvent(const SyncerEvent& event); |
989 | 969 |
990 // We have a direct hookup to the authwatcher to be notified for auth failures | 970 // Listens for notifications from the ServerConnectionManager |
991 // on startup, to serve our UI needs. | 971 void HandleServerConnectionEvent(const ServerConnectionEvent& event); |
992 void HandleAuthWatcherEvent(const AuthWatcherEvent& event); | |
993 | 972 |
994 // Listen here for directory opened events. | 973 // Open the directory named with username_for_share |
995 void HandleDirectoryManagerEvent( | 974 bool OpenDirectory(); |
996 const syncable::DirectoryManagerEvent& event); | |
997 | 975 |
998 // Login to the talk mediator with the given credentials. | 976 // Login to the talk mediator with the given credentials. |
999 void TalkMediatorLogin( | 977 void TalkMediatorLogin( |
1000 const std::string& email, const std::string& token); | 978 const std::string& email, const std::string& token); |
1001 | 979 |
1002 // TalkMediator::Delegate implementation. | 980 // TalkMediator::Delegate implementation. |
1003 | |
1004 virtual void OnNotificationStateChange( | 981 virtual void OnNotificationStateChange( |
1005 bool notifications_enabled); | 982 bool notifications_enabled); |
1006 | 983 |
1007 virtual void OnIncomingNotification( | 984 virtual void OnIncomingNotification( |
1008 const IncomingNotificationData& notification_data); | 985 const IncomingNotificationData& notification_data); |
1009 | 986 |
1010 virtual void OnOutgoingNotification(); | 987 virtual void OnOutgoingNotification(); |
1011 | 988 |
1012 // Accessors for the private members. | 989 // Accessors for the private members. |
1013 DirectoryManager* dir_manager() { return share_.dir_manager.get(); } | 990 DirectoryManager* dir_manager() { return share_.dir_manager.get(); } |
1014 SyncAPIServerConnectionManager* connection_manager() { | 991 SyncAPIServerConnectionManager* connection_manager() { |
1015 return connection_manager_.get(); | 992 return connection_manager_.get(); |
1016 } | 993 } |
1017 SyncerThread* syncer_thread() { return syncer_thread_.get(); } | 994 SyncerThread* syncer_thread() { return syncer_thread_.get(); } |
1018 TalkMediator* talk_mediator() { return talk_mediator_.get(); } | 995 TalkMediator* talk_mediator() { return talk_mediator_.get(); } |
1019 AuthWatcher* auth_watcher() { return auth_watcher_.get(); } | |
1020 void set_observer(SyncManager::Observer* observer) { observer_ = observer; } | 996 void set_observer(SyncManager::Observer* observer) { observer_ = observer; } |
1021 UserShare* GetUserShare() { return &share_; } | 997 UserShare* GetUserShare() { return &share_; } |
1022 | 998 |
1023 // Return the currently active (validated) username for use with syncable | 999 // Return the currently active (validated) username for use with syncable |
1024 // types. | 1000 // types. |
1025 const std::string& username_for_share() const { | 1001 const std::string& username_for_share() const { |
1026 return share_.authenticated_name; | 1002 return share_.name; |
1027 } | 1003 } |
1028 | 1004 |
1029 // Note about SyncManager::Status implementation: Status is a trimmed | 1005 // Note about SyncManager::Status implementation: Status is a trimmed |
1030 // down AllStatus::Status, augmented with authentication failure information | 1006 // down AllStatus::Status, augmented with authentication failure information |
1031 // gathered from the internal AuthWatcher. The sync UI itself hooks up to | 1007 // gathered from the internal AuthWatcher. The sync UI itself hooks up to |
1032 // various sources like the AuthWatcher individually, but with syncapi we try | 1008 // various sources like the AuthWatcher individually, but with syncapi we try |
1033 // to keep everything status-related in one place. This means we have to | 1009 // to keep everything status-related in one place. This means we have to |
1034 // privately manage state about authentication failures, and whenever the | 1010 // privately manage state about authentication failures, and whenever the |
1035 // status or status summary is requested we aggregate this state with | 1011 // status or status summary is requested we aggregate this state with |
1036 // AllStatus::Status information. | 1012 // AllStatus::Status information. |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1071 registrar_->GetModelSafeRoutingInfo(&enabled_types); | 1047 registrar_->GetModelSafeRoutingInfo(&enabled_types); |
1072 for (ModelSafeRoutingInfo::const_iterator i = enabled_types.begin(); | 1048 for (ModelSafeRoutingInfo::const_iterator i = enabled_types.begin(); |
1073 i != enabled_types.end(); ++i) { | 1049 i != enabled_types.end(); ++i) { |
1074 if (!lookup->initial_sync_ended_for_type(i->first)) | 1050 if (!lookup->initial_sync_ended_for_type(i->first)) |
1075 return false; | 1051 return false; |
1076 } | 1052 } |
1077 return true; | 1053 return true; |
1078 } | 1054 } |
1079 | 1055 |
1080 private: | 1056 private: |
1081 // Try to authenticate using a LSID cookie. | |
1082 void AuthenticateWithLsid(const std::string& lsid); | |
1083 | |
1084 // Try to authenticate using persisted credentials from a previous successful | |
1085 // authentication. If no such credentials exist, calls OnAuthError on the | |
1086 // client to collect credentials. Otherwise, there exist local credentials | |
1087 // that were once used for a successful auth, so we'll try to re-use these. | |
1088 // Failure of that attempt will be communicated as normal using OnAuthError. | |
1089 // Since this entry point will bypass normal GAIA authentication and try to | |
1090 // authenticate directly with the sync service using a cached token, | |
1091 // authentication failure will generally occur due to expired credentials, or | |
1092 // possibly because of a password change. | |
1093 bool AuthenticateForUser(const std::string& username, | |
1094 const std::string& auth_token); | |
1095 | |
1096 // Helper to call OnAuthError when no authentication credentials are | 1057 // Helper to call OnAuthError when no authentication credentials are |
1097 // available. | 1058 // available. |
1098 void RaiseAuthNeededEvent(); | 1059 void RaiseAuthNeededEvent(); |
1099 | 1060 |
1100 // Helper to set initialized_ to true and raise an event to clients to notify | 1061 // Helper to set initialized_ to true and raise an event to clients to notify |
1101 // that initialization is complete and it is safe to send us changes. If | 1062 // that initialization is complete and it is safe to send us changes. If |
1102 // already initialized, this is a no-op. | 1063 // already initialized, this is a no-op. |
1103 void MarkAndNotifyInitializationComplete(); | 1064 void MarkAndNotifyInitializationComplete(); |
1104 | 1065 |
1105 // If there's a pending notification to be sent, either from the | 1066 // If there's a pending notification to be sent, either from the |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1164 } else { | 1125 } else { |
1165 NOTREACHED() << "Should be valid connection manager!"; | 1126 NOTREACHED() << "Should be valid connection manager!"; |
1166 } | 1127 } |
1167 } | 1128 } |
1168 | 1129 |
1169 // We couple the DirectoryManager and username together in a UserShare member | 1130 // We couple the DirectoryManager and username together in a UserShare member |
1170 // so we can return a handle to share_ to clients of the API for use when | 1131 // so we can return a handle to share_ to clients of the API for use when |
1171 // constructing any transaction type. | 1132 // constructing any transaction type. |
1172 UserShare share_; | 1133 UserShare share_; |
1173 | 1134 |
1174 // A wrapper around a sqlite store used for caching authentication data, | |
1175 // last user information, current sync-related URLs, and more. | |
1176 scoped_ptr<UserSettings> user_settings_; | |
1177 | |
1178 MessageLoop* core_message_loop_; | 1135 MessageLoop* core_message_loop_; |
1179 | 1136 |
1180 // Observer registered via SetObserver/RemoveObserver. | 1137 // Observer registered via SetObserver/RemoveObserver. |
1181 // WARNING: This can be NULL! | 1138 // WARNING: This can be NULL! |
1182 SyncManager::Observer* observer_; | 1139 SyncManager::Observer* observer_; |
1183 | 1140 |
1184 // The ServerConnectionManager used to abstract communication between the | 1141 // The ServerConnectionManager used to abstract communication between the |
1185 // client (the Syncer) and the sync server. | 1142 // client (the Syncer) and the sync server. |
1186 scoped_ptr<SyncAPIServerConnectionManager> connection_manager_; | 1143 scoped_ptr<SyncAPIServerConnectionManager> connection_manager_; |
1187 | 1144 |
1188 // The thread that runs the Syncer. Needs to be explicitly Start()ed. | 1145 // The thread that runs the Syncer. Needs to be explicitly Start()ed. |
1189 scoped_refptr<SyncerThread> syncer_thread_; | 1146 scoped_refptr<SyncerThread> syncer_thread_; |
1190 | 1147 |
1191 // Notification (xmpp) handler. | 1148 // Notification (xmpp) handler. |
1192 scoped_ptr<TalkMediator> talk_mediator_; | 1149 scoped_ptr<TalkMediator> talk_mediator_; |
1193 | 1150 |
1194 // A multi-purpose status watch object that aggregates stats from various | 1151 // A multi-purpose status watch object that aggregates stats from various |
1195 // sync components. | 1152 // sync components. |
1196 AllStatus allstatus_; | 1153 AllStatus allstatus_; |
1197 | 1154 |
1198 // AuthWatcher kicks off the authentication process and follows it through | |
1199 // phase 1 (GAIA) to phase 2 (sync engine). As part of this work it determines | |
1200 // the initial connectivity and causes the server connection event to be | |
1201 // broadcast, which signals the syncer thread to start syncing. | |
1202 // It has a heavy duty constructor requiring boilerplate so we heap allocate. | |
1203 scoped_refptr<AuthWatcher> auth_watcher_; | |
1204 | |
1205 // Each element of this array is a store of change records produced by | 1155 // Each element of this array is a store of change records produced by |
1206 // HandleChangeEvent during the CALCULATE_CHANGES step. The changes are | 1156 // HandleChangeEvent during the CALCULATE_CHANGES step. The changes are |
1207 // segregated by model type, and are stored here to be processed and | 1157 // segregated by model type, and are stored here to be processed and |
1208 // forwarded to the observer slightly later, at the TRANSACTION_ENDING | 1158 // forwarded to the observer slightly later, at the TRANSACTION_ENDING |
1209 // step by HandleTransactionEndingChangeEvent. | 1159 // step by HandleTransactionEndingChangeEvent. |
1210 ChangeReorderBuffer change_buffers_[syncable::MODEL_TYPE_COUNT]; | 1160 ChangeReorderBuffer change_buffers_[syncable::MODEL_TYPE_COUNT]; |
1211 | 1161 |
1212 // The event listener hookup that is registered for HandleChangeEvent. | 1162 // The event listener hookup that is registered for HandleChangeEvent. |
1213 scoped_ptr<browser_sync::ChannelHookup<syncable::DirectoryChangeEvent> > | 1163 scoped_ptr<browser_sync::ChannelHookup<syncable::DirectoryChangeEvent> > |
1214 dir_change_hookup_; | 1164 dir_change_hookup_; |
1215 | 1165 |
| 1166 // Event listener hookup for the ServerConnectionManager. |
| 1167 scoped_ptr<EventListenerHookup> connection_manager_hookup_; |
| 1168 |
1216 // The event listener hookup registered for HandleSyncerEvent. | 1169 // The event listener hookup registered for HandleSyncerEvent. |
1217 scoped_ptr<browser_sync::ChannelHookup<SyncerEvent> > syncer_event_; | 1170 scoped_ptr<browser_sync::ChannelHookup<SyncerEvent> > syncer_event_; |
1218 | 1171 |
1219 // The event listener hookup registered for HandleAuthWatcherEvent. | |
1220 scoped_ptr<EventListenerHookup> authwatcher_hookup_; | |
1221 | |
1222 // The event listener hookup registered for the DirectoryManager (OPENED). | |
1223 scoped_ptr<EventListenerHookup> directory_manager_hookup_; | |
1224 | |
1225 // Our cache of a recent authentication problem. If no authentication problem | |
1226 // occurred, or if the last problem encountered has been cleared (by a | |
1227 // subsequent AuthWatcherEvent), this is set to NONE. | |
1228 AuthError::State auth_problem_; | |
1229 | |
1230 // The sync dir_manager to which we belong. | 1172 // The sync dir_manager to which we belong. |
1231 SyncManager* const sync_manager_; | 1173 SyncManager* const sync_manager_; |
1232 | 1174 |
1233 // The entity that provides us with information about which types to sync. | 1175 // The entity that provides us with information about which types to sync. |
1234 // The instance is shared between the SyncManager and the Syncer. | 1176 // The instance is shared between the SyncManager and the Syncer. |
1235 ModelSafeWorkerRegistrar* registrar_; | 1177 ModelSafeWorkerRegistrar* registrar_; |
1236 | 1178 |
1237 // True if the next SyncCycle should notify peers of an update. | 1179 // True if the next SyncCycle should notify peers of an update. |
1238 bool notification_pending_; | 1180 bool notification_pending_; |
1239 | 1181 |
(...skipping 14 matching lines...) Expand all Loading... |
1254 const int SyncManager::SyncInternal::kDefaultNudgeDelayMilliseconds = 200; | 1196 const int SyncManager::SyncInternal::kDefaultNudgeDelayMilliseconds = 200; |
1255 const int SyncManager::SyncInternal::kPreferencesNudgeDelayMilliseconds = 2000; | 1197 const int SyncManager::SyncInternal::kPreferencesNudgeDelayMilliseconds = 2000; |
1256 | 1198 |
1257 SyncManager::SyncManager() { | 1199 SyncManager::SyncManager() { |
1258 data_ = new SyncInternal(this); | 1200 data_ = new SyncInternal(this); |
1259 } | 1201 } |
1260 | 1202 |
1261 bool SyncManager::Init(const FilePath& database_location, | 1203 bool SyncManager::Init(const FilePath& database_location, |
1262 const char* sync_server_and_path, | 1204 const char* sync_server_and_path, |
1263 int sync_server_port, | 1205 int sync_server_port, |
1264 const char* gaia_service_id, | |
1265 const char* gaia_source, | |
1266 bool use_ssl, | 1206 bool use_ssl, |
1267 HttpPostProviderFactory* post_factory, | 1207 HttpPostProviderFactory* post_factory, |
1268 HttpPostProviderFactory* auth_post_factory, | |
1269 ModelSafeWorkerRegistrar* registrar, | 1208 ModelSafeWorkerRegistrar* registrar, |
1270 bool attempt_last_user_authentication, | |
1271 bool invalidate_last_user_auth_token, | |
1272 bool invalidate_xmpp_auth_token, | |
1273 const char* user_agent, | 1209 const char* user_agent, |
1274 const char* lsid, | 1210 const SyncCredentials& credentials, |
1275 bool use_chrome_async_socket, | 1211 bool use_chrome_async_socket, |
1276 bool try_ssltcp_first, | 1212 bool try_ssltcp_first, |
1277 browser_sync::NotificationMethod notification_method, | 1213 browser_sync::NotificationMethod notification_method, |
1278 const std::string& restored_key_for_bootstrapping) { | 1214 const std::string& restored_key_for_bootstrapping) { |
1279 DCHECK(post_factory); | 1215 DCHECK(post_factory); |
1280 LOG(INFO) << "SyncManager starting Init..."; | 1216 LOG(INFO) << "SyncManager starting Init..."; |
1281 string server_string(sync_server_and_path); | 1217 string server_string(sync_server_and_path); |
1282 return data_->Init(database_location, | 1218 return data_->Init(database_location, |
1283 server_string, | 1219 server_string, |
1284 sync_server_port, | 1220 sync_server_port, |
1285 gaia_service_id, | |
1286 gaia_source, | |
1287 use_ssl, | 1221 use_ssl, |
1288 post_factory, | 1222 post_factory, |
1289 auth_post_factory, | |
1290 registrar, | 1223 registrar, |
1291 attempt_last_user_authentication, | |
1292 invalidate_last_user_auth_token, | |
1293 invalidate_xmpp_auth_token, | |
1294 user_agent, | 1224 user_agent, |
1295 lsid, | 1225 credentials, |
1296 use_chrome_async_socket, | 1226 use_chrome_async_socket, |
1297 try_ssltcp_first, | 1227 try_ssltcp_first, |
1298 notification_method, | 1228 notification_method, |
1299 restored_key_for_bootstrapping); | 1229 restored_key_for_bootstrapping); |
1300 } | 1230 } |
1301 | 1231 |
1302 void SyncManager::Authenticate(const char* username, const char* password, | 1232 void SyncManager::UpdateCredentials(const SyncCredentials& credentials) { |
1303 const char* captcha) { | 1233 data_->UpdateCredentials(credentials); |
1304 data_->Authenticate(std::string(username), std::string(password), | |
1305 std::string(captcha)); | |
1306 } | 1234 } |
1307 | 1235 |
| 1236 |
1308 bool SyncManager::InitialSyncEndedForAllEnabledTypes() { | 1237 bool SyncManager::InitialSyncEndedForAllEnabledTypes() { |
1309 return data_->InitialSyncEndedForAllEnabledTypes(); | 1238 return data_->InitialSyncEndedForAllEnabledTypes(); |
1310 } | 1239 } |
1311 | 1240 |
1312 void SyncManager::StartSyncing() { | 1241 void SyncManager::StartSyncing() { |
1313 data_->StartSyncing(); | 1242 data_->StartSyncing(); |
1314 } | 1243 } |
1315 | 1244 |
1316 void SyncManager::SetPassphrase(const std::string& passphrase) { | 1245 void SyncManager::SetPassphrase(const std::string& passphrase) { |
1317 data_->SetPassphrase(passphrase); | 1246 data_->SetPassphrase(passphrase); |
1318 } | 1247 } |
1319 | 1248 |
1320 bool SyncManager::RequestPause() { | 1249 bool SyncManager::RequestPause() { |
1321 return data_->syncer_thread()->RequestPause(); | 1250 return data_->syncer_thread()->RequestPause(); |
1322 } | 1251 } |
1323 | 1252 |
1324 bool SyncManager::RequestResume() { | 1253 bool SyncManager::RequestResume() { |
1325 return data_->syncer_thread()->RequestResume(); | 1254 return data_->syncer_thread()->RequestResume(); |
1326 } | 1255 } |
1327 | 1256 |
1328 void SyncManager::RequestNudge() { | 1257 void SyncManager::RequestNudge() { |
1329 data_->syncer_thread()->NudgeSyncer(0, SyncerThread::kLocal); | 1258 data_->syncer_thread()->NudgeSyncer(0, SyncerThread::kLocal); |
1330 } | 1259 } |
1331 | 1260 |
| 1261 // TODO(chron): Don't need to plumb this so deep. |
1332 const std::string& SyncManager::GetAuthenticatedUsername() { | 1262 const std::string& SyncManager::GetAuthenticatedUsername() { |
1333 DCHECK(data_); | 1263 DCHECK(data_); |
1334 return data_->username_for_share(); | 1264 return data_->username_for_share(); |
1335 } | 1265 } |
1336 | 1266 |
1337 bool SyncManager::SyncInternal::Init( | 1267 bool SyncManager::SyncInternal::Init( |
1338 const FilePath& database_location, | 1268 const FilePath& database_location, |
1339 const std::string& sync_server_and_path, | 1269 const std::string& sync_server_and_path, |
1340 int port, | 1270 int port, |
1341 const char* gaia_service_id, | |
1342 const char* gaia_source, | |
1343 bool use_ssl, | 1271 bool use_ssl, |
1344 HttpPostProviderFactory* post_factory, | 1272 HttpPostProviderFactory* post_factory, |
1345 HttpPostProviderFactory* auth_post_factory, | |
1346 ModelSafeWorkerRegistrar* model_safe_worker_registrar, | 1273 ModelSafeWorkerRegistrar* model_safe_worker_registrar, |
1347 bool attempt_last_user_authentication, | |
1348 bool invalidate_last_user_auth_token, | |
1349 bool invalidate_xmpp_auth_token, | |
1350 const char* user_agent, | 1274 const char* user_agent, |
1351 const std::string& lsid, | 1275 const SyncCredentials& credentials, |
1352 bool use_chrome_async_socket, | 1276 bool use_chrome_async_socket, |
1353 bool try_ssltcp_first, | 1277 bool try_ssltcp_first, |
1354 browser_sync::NotificationMethod notification_method, | 1278 browser_sync::NotificationMethod notification_method, |
1355 const std::string& restored_key_for_bootstrapping) { | 1279 const std::string& restored_key_for_bootstrapping) { |
1356 | 1280 |
1357 LOG(INFO) << "Starting SyncInternal initialization."; | 1281 LOG(INFO) << "Starting SyncInternal initialization."; |
1358 | 1282 |
1359 core_message_loop_ = MessageLoop::current(); | 1283 core_message_loop_ = MessageLoop::current(); |
1360 DCHECK(core_message_loop_); | 1284 DCHECK(core_message_loop_); |
1361 notification_method_ = notification_method; | 1285 notification_method_ = notification_method; |
1362 // Set up UserSettings, creating the db if necessary. We need this to | |
1363 // instantiate a URLFactory to give to the Syncer. | |
1364 FilePath settings_db_file = | |
1365 database_location.Append(FilePath(kBookmarkSyncUserSettingsDatabase)); | |
1366 user_settings_.reset(new UserSettings()); | |
1367 if (!user_settings_->Init(settings_db_file)) | |
1368 return false; | |
1369 | |
1370 registrar_ = model_safe_worker_registrar; | 1286 registrar_ = model_safe_worker_registrar; |
1371 | 1287 |
1372 LOG(INFO) << "Initialized sync user settings. Starting DirectoryManager."; | 1288 share_.dir_manager.reset(new DirectoryManager(database_location)); |
1373 | 1289 |
1374 share_.dir_manager.reset(new DirectoryManager(database_location)); | 1290 connection_manager_.reset(new SyncAPIServerConnectionManager( |
1375 directory_manager_hookup_.reset(NewEventListenerHookup( | 1291 sync_server_and_path, port, use_ssl, user_agent, post_factory)); |
1376 share_.dir_manager->channel(), this, | |
1377 &SyncInternal::HandleDirectoryManagerEvent)); | |
1378 share_.dir_manager->cryptographer()->Bootstrap( | |
1379 restored_key_for_bootstrapping); | |
1380 | 1292 |
1381 string client_id = user_settings_->GetClientId(); | 1293 connection_manager_hookup_.reset( |
1382 connection_manager_.reset(new SyncAPIServerConnectionManager( | 1294 NewEventListenerHookup(connection_manager()->channel(), this, |
1383 sync_server_and_path, port, use_ssl, user_agent, client_id, | 1295 &SyncManager::SyncInternal::HandleServerConnectionEvent)); |
1384 post_factory)); | |
1385 | |
1386 // Watch various objects for aggregated status. | |
1387 allstatus_.WatchConnectionManager(connection_manager()); | |
1388 | 1296 |
1389 net::NetworkChangeNotifier::AddObserver(this); | 1297 net::NetworkChangeNotifier::AddObserver(this); |
1390 // TODO(akalin): CheckServerReachable() can block, which may cause jank if we | 1298 // TODO(akalin): CheckServerReachable() can block, which may cause jank if we |
1391 // try to shut down sync. Fix this. | 1299 // try to shut down sync. Fix this. |
1392 core_message_loop_->PostTask(FROM_HERE, | 1300 core_message_loop_->PostTask(FROM_HERE, |
1393 method_factory_.NewRunnableMethod(&SyncInternal::CheckServerReachable)); | 1301 method_factory_.NewRunnableMethod(&SyncInternal::CheckServerReachable)); |
1394 | 1302 |
1395 // NOTIFICATION_SERVER uses a substantially different notification method, so | 1303 // NOTIFICATION_SERVER uses a substantially different notification method, so |
1396 // it has its own MediatorThread implementation. Everything else just uses | 1304 // it has its own MediatorThread implementation. Everything else just uses |
1397 // MediatorThreadImpl. | 1305 // MediatorThreadImpl. |
1398 notifier::MediatorThread* mediator_thread = | 1306 notifier::MediatorThread* mediator_thread = |
1399 (notification_method == browser_sync::NOTIFICATION_SERVER) ? | 1307 (notification_method == browser_sync::NOTIFICATION_SERVER) ? |
1400 new sync_notifier::ServerNotifierThread(use_chrome_async_socket, | 1308 new sync_notifier::ServerNotifierThread(use_chrome_async_socket, |
1401 try_ssltcp_first) : | 1309 try_ssltcp_first) : |
1402 new notifier::MediatorThreadImpl(use_chrome_async_socket, | 1310 new notifier::MediatorThreadImpl(use_chrome_async_socket, |
1403 try_ssltcp_first); | 1311 try_ssltcp_first); |
1404 const bool kInitializeSsl = true; | 1312 const bool kInitializeSsl = true; |
1405 const bool kConnectImmediately = false; | 1313 const bool kConnectImmediately = false; |
1406 talk_mediator_.reset(new TalkMediatorImpl(mediator_thread, kInitializeSsl, | 1314 talk_mediator_.reset(new TalkMediatorImpl(mediator_thread, kInitializeSsl, |
1407 kConnectImmediately, invalidate_xmpp_auth_token)); | 1315 kConnectImmediately, false)); |
1408 if (notification_method != browser_sync::NOTIFICATION_LEGACY && | 1316 if (notification_method != browser_sync::NOTIFICATION_LEGACY && |
1409 notification_method != browser_sync::NOTIFICATION_SERVER) { | 1317 notification_method != browser_sync::NOTIFICATION_SERVER) { |
1410 if (notification_method == browser_sync::NOTIFICATION_TRANSITIONAL) { | 1318 if (notification_method == browser_sync::NOTIFICATION_TRANSITIONAL) { |
1411 talk_mediator_->AddSubscribedServiceUrl( | 1319 talk_mediator_->AddSubscribedServiceUrl( |
1412 browser_sync::kSyncLegacyServiceUrl); | 1320 browser_sync::kSyncLegacyServiceUrl); |
1413 } | 1321 } |
1414 talk_mediator_->AddSubscribedServiceUrl(browser_sync::kSyncServiceUrl); | 1322 talk_mediator_->AddSubscribedServiceUrl(browser_sync::kSyncServiceUrl); |
1415 } | 1323 } |
1416 | 1324 |
1417 // Listen to TalkMediator events ourselves | 1325 // Listen to TalkMediator events ourselves |
1418 talk_mediator_->SetDelegate(this); | 1326 talk_mediator_->SetDelegate(this); |
1419 | 1327 |
1420 std::string gaia_url = gaia::kGaiaUrl; | 1328 LOG(INFO) << "Sync is bringing up SyncSessionContext."; |
1421 const char* service_id = gaia_service_id ? | |
1422 gaia_service_id : SYNC_SERVICE_NAME; | |
1423 | |
1424 BridgedGaiaAuthenticator* gaia_auth = new BridgedGaiaAuthenticator( | |
1425 gaia_source, service_id, gaia_url, auth_post_factory); | |
1426 | |
1427 LOG(INFO) << "Sync is bringing up authwatcher and SyncSessionContext."; | |
1428 | |
1429 auth_watcher_ = new AuthWatcher(dir_manager(), | |
1430 connection_manager(), | |
1431 gaia_source, | |
1432 service_id, | |
1433 gaia_url, | |
1434 user_settings_.get(), | |
1435 gaia_auth); | |
1436 | |
1437 authwatcher_hookup_.reset(NewEventListenerHookup(auth_watcher_->channel(), | |
1438 this, &SyncInternal::HandleAuthWatcherEvent)); | |
1439 | 1329 |
1440 // Build a SyncSessionContext and store the worker in it. | 1330 // Build a SyncSessionContext and store the worker in it. |
1441 SyncSessionContext* context = new SyncSessionContext( | 1331 SyncSessionContext* context = new SyncSessionContext( |
1442 connection_manager_.get(), auth_watcher(), | 1332 connection_manager_.get(), dir_manager(), model_safe_worker_registrar); |
1443 dir_manager(), model_safe_worker_registrar); | |
1444 | 1333 |
1445 // The SyncerThread takes ownership of |context|. | 1334 // The SyncerThread takes ownership of |context|. |
1446 syncer_thread_ = new SyncerThread(context); | 1335 syncer_thread_ = new SyncerThread(context); |
1447 allstatus_.WatchSyncerThread(syncer_thread()); | 1336 allstatus_.WatchSyncerThread(syncer_thread()); |
1448 | 1337 |
1449 // Subscribe to the syncer thread's channel. | 1338 // Subscribe to the syncer thread's channel. |
1450 syncer_event_.reset(syncer_thread()->relay_channel()->AddObserver(this)); | 1339 syncer_event_.reset(syncer_thread()->relay_channel()->AddObserver(this)); |
1451 | 1340 |
1452 bool attempting_auth = false; | 1341 return SignIn(credentials); |
1453 std::string username, auth_token; | |
1454 if (attempt_last_user_authentication && | |
1455 auth_watcher()->settings()->GetLastUserAndServiceToken( | |
1456 SYNC_SERVICE_NAME, &username, &auth_token)) { | |
1457 if (invalidate_last_user_auth_token) { | |
1458 auth_token += "bogus"; | |
1459 } | |
1460 attempting_auth = AuthenticateForUser(username, auth_token); | |
1461 } else if (!lsid.empty()) { | |
1462 attempting_auth = true; | |
1463 AuthenticateWithLsid(lsid); | |
1464 } | |
1465 if (attempt_last_user_authentication && !attempting_auth) | |
1466 RaiseAuthNeededEvent(); | |
1467 return true; | |
1468 } | 1342 } |
1469 | 1343 |
1470 void SyncManager::SyncInternal::StartSyncing() { | 1344 void SyncManager::SyncInternal::StartSyncing() { |
1471 if (syncer_thread()) // NULL during certain unittests. | 1345 if (syncer_thread()) // NULL during certain unittests. |
1472 syncer_thread()->Start(); // Start the syncer thread. This won't actually | 1346 syncer_thread()->Start(); // Start the syncer thread. This won't actually |
1473 // result in any syncing until at least the | 1347 // result in any syncing until at least the |
1474 // DirectoryManager broadcasts the OPENED event, | 1348 // DirectoryManager broadcasts the OPENED event, |
1475 // and a valid server connection is detected. | 1349 // and a valid server connection is detected. |
1476 } | 1350 } |
1477 | 1351 |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1529 } | 1403 } |
1530 bool success = talk_mediator_->SendNotification(notification_data); | 1404 bool success = talk_mediator_->SendNotification(notification_data); |
1531 if (success) { | 1405 if (success) { |
1532 notification_pending_ = false; | 1406 notification_pending_ = false; |
1533 LOG(INFO) << "Sent XMPP notification"; | 1407 LOG(INFO) << "Sent XMPP notification"; |
1534 } else { | 1408 } else { |
1535 LOG(INFO) << "Could not send XMPP notification"; | 1409 LOG(INFO) << "Could not send XMPP notification"; |
1536 } | 1410 } |
1537 } | 1411 } |
1538 | 1412 |
1539 void SyncManager::SyncInternal::Authenticate(const std::string& username, | 1413 bool SyncManager::SyncInternal::OpenDirectory() { |
1540 const std::string& password, | 1414 DCHECK(!initialized()) << "Should only happen once"; |
1541 const std::string& captcha) { | |
1542 DCHECK(username_for_share().empty() || username == username_for_share()) | |
1543 << "Username change from valid username detected"; | |
1544 if (allstatus_.status().authenticated) | |
1545 return; | |
1546 if (password.empty()) { | |
1547 // TODO(timsteele): Seems like this shouldn't be needed, but auth_watcher | |
1548 // currently drops blank password attempts on the floor and doesn't update | |
1549 // state; it only LOGs an error in this case. We want to make sure we set | |
1550 // our GoogleServiceAuthError state to denote an error. | |
1551 RaiseAuthNeededEvent(); | |
1552 } | |
1553 auth_watcher()->Authenticate(username, password, std::string(), | |
1554 captcha); | |
1555 } | |
1556 | 1415 |
1557 void SyncManager::SyncInternal::AuthenticateWithLsid(const string& lsid) { | 1416 bool share_opened = dir_manager()->Open(username_for_share()); |
1558 DCHECK(!lsid.empty()); | 1417 DCHECK(share_opened); |
1559 auth_watcher()->AuthenticateWithLsid(lsid); | 1418 if (!share_opened) { |
1560 } | 1419 if (observer_) { |
| 1420 observer_->OnStopSyncingPermanently(); |
| 1421 } |
1561 | 1422 |
1562 bool SyncManager::SyncInternal::AuthenticateForUser( | 1423 LOG(ERROR) << "Could not open share for:" << username_for_share(); |
1563 const std::string& username, const std::string& auth_token) { | |
1564 share_.authenticated_name = username; | |
1565 | |
1566 // We optimize by opening the directory before the "fresh" authentication | |
1567 // attempt completes so that we can immediately begin processing changes. | |
1568 if (!dir_manager()->Open(username_for_share())) { | |
1569 if (observer_) | |
1570 observer_->OnStopSyncingPermanently(); | |
1571 return false; | 1424 return false; |
1572 } | 1425 } |
1573 | 1426 |
1574 // Load the last-known good auth token into the connection manager and send | 1427 // Database has to be initialized for the guid to be available. |
1575 // it off to the AuthWatcher for validation. The result of the validation | 1428 syncable::ScopedDirLookup lookup(dir_manager(), username_for_share()); |
1576 // will update the connection manager if necessary. | 1429 if (!lookup.good()) { |
1577 connection_manager()->set_auth_token(auth_token); | 1430 NOTREACHED(); |
1578 auth_watcher()->AuthenticateWithToken(username, auth_token); | 1431 return false; |
| 1432 } |
| 1433 |
| 1434 connection_manager()->set_client_id(lookup->cache_guid()); |
| 1435 syncer_thread()->CreateSyncer(username_for_share()); |
| 1436 MarkAndNotifyInitializationComplete(); |
| 1437 dir_change_hookup_.reset(lookup->AddChangeObserver(this)); |
1579 return true; | 1438 return true; |
1580 } | 1439 } |
1581 | 1440 |
| 1441 bool SyncManager::SyncInternal::SignIn(const SyncCredentials& credentials) { |
| 1442 DCHECK_EQ(MessageLoop::current(), core_message_loop_); |
| 1443 DCHECK(share_.name.empty()); |
| 1444 share_.name = credentials.email; |
| 1445 |
| 1446 LOG(INFO) << "Signing in user: " << username_for_share(); |
| 1447 if (!OpenDirectory()) { |
| 1448 return false; |
| 1449 } |
| 1450 |
| 1451 UpdateCredentials(credentials); |
| 1452 return true; |
| 1453 } |
| 1454 |
| 1455 void SyncManager::SyncInternal::UpdateCredentials( |
| 1456 const SyncCredentials& credentials) { |
| 1457 DCHECK_EQ(MessageLoop::current(), core_message_loop_); |
| 1458 DCHECK(share_.name == credentials.email); |
| 1459 connection_manager()->set_auth_token(credentials.sync_token); |
| 1460 TalkMediatorLogin(credentials.email, credentials.sync_token); |
| 1461 CheckServerReachable(); |
| 1462 sync_manager_->RequestNudge(); |
| 1463 } |
| 1464 |
1582 void SyncManager::SyncInternal::RaiseAuthNeededEvent() { | 1465 void SyncManager::SyncInternal::RaiseAuthNeededEvent() { |
1583 auth_problem_ = AuthError::INVALID_GAIA_CREDENTIALS; | 1466 if (observer_) { |
1584 if (observer_) | 1467 observer_->OnAuthError(AuthError(AuthError::INVALID_GAIA_CREDENTIALS)); |
1585 observer_->OnAuthError(AuthError(auth_problem_)); | 1468 } |
1586 } | 1469 } |
1587 | 1470 |
1588 void SyncManager::SyncInternal::SetPassphrase( | 1471 void SyncManager::SyncInternal::SetPassphrase( |
1589 const std::string& passphrase) { | 1472 const std::string& passphrase) { |
1590 Cryptographer* cryptographer = dir_manager()->cryptographer(); | 1473 Cryptographer* cryptographer = dir_manager()->cryptographer(); |
1591 KeyParams params = {"localhost", "dummy", passphrase}; | 1474 KeyParams params = {"localhost", "dummy", passphrase}; |
1592 if (cryptographer->has_pending_keys()) { | 1475 if (cryptographer->has_pending_keys()) { |
1593 if (!cryptographer->DecryptPendingKeys(params)) { | 1476 if (!cryptographer->DecryptPendingKeys(params)) { |
1594 observer_->OnPassphraseRequired(); | 1477 observer_->OnPassphraseRequired(); |
1595 return; | 1478 return; |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1635 | 1518 |
1636 void SyncManager::SyncInternal::Shutdown() { | 1519 void SyncManager::SyncInternal::Shutdown() { |
1637 method_factory_.RevokeAll(); | 1520 method_factory_.RevokeAll(); |
1638 | 1521 |
1639 // We NULL out talk_mediator_ so that any tasks pumped below do not | 1522 // We NULL out talk_mediator_ so that any tasks pumped below do not |
1640 // trigger further XMPP actions. | 1523 // trigger further XMPP actions. |
1641 // | 1524 // |
1642 // TODO(akalin): NULL the other member variables defensively, too. | 1525 // TODO(akalin): NULL the other member variables defensively, too. |
1643 scoped_ptr<TalkMediator> talk_mediator(talk_mediator_.release()); | 1526 scoped_ptr<TalkMediator> talk_mediator(talk_mediator_.release()); |
1644 | 1527 |
1645 // First reset the AuthWatcher in case an auth attempt is in progress so that | |
1646 // it terminates gracefully before we shutdown and close other components. | |
1647 // Otherwise the attempt can complete after we've closed the directory, for | |
1648 // example, and cause initialization to continue, which is bad. | |
1649 if (auth_watcher_) { | |
1650 auth_watcher_->Shutdown(); | |
1651 authwatcher_hookup_.reset(); | |
1652 } | |
1653 | |
1654 if (syncer_thread()) { | 1528 if (syncer_thread()) { |
1655 if (!syncer_thread()->Stop(kThreadExitTimeoutMsec)) { | 1529 if (!syncer_thread()->Stop(kThreadExitTimeoutMsec)) { |
1656 LOG(FATAL) << "Unable to stop the syncer, it won't be happy..."; | 1530 LOG(FATAL) << "Unable to stop the syncer, it won't be happy..."; |
1657 } | 1531 } |
1658 syncer_event_.reset(); | 1532 syncer_event_.reset(); |
1659 syncer_thread_ = NULL; | 1533 syncer_thread_ = NULL; |
1660 } | 1534 } |
1661 | 1535 |
1662 // TODO(chron): Since the auth_watcher_ is held by the sync session state, | |
1663 // we release the ref here after the syncer is deallocated. | |
1664 // In reality the SyncerSessionState's pointer to the | |
1665 // authwatcher should be ref counted, but for M6 we use this | |
1666 // lower risk fix so it's deallocated on the original thread. | |
1667 if (auth_watcher_) { | |
1668 auth_watcher_ = NULL; | |
1669 } | |
1670 | |
1671 // Shutdown the xmpp buzz connection. | 1536 // Shutdown the xmpp buzz connection. |
1672 if (talk_mediator.get()) { | 1537 if (talk_mediator.get()) { |
1673 LOG(INFO) << "P2P: Mediator logout started."; | 1538 LOG(INFO) << "P2P: Mediator logout started."; |
1674 talk_mediator->Logout(); | 1539 talk_mediator->Logout(); |
1675 LOG(INFO) << "P2P: Mediator logout completed."; | 1540 LOG(INFO) << "P2P: Mediator logout completed."; |
1676 talk_mediator.reset(); | 1541 talk_mediator.reset(); |
1677 LOG(INFO) << "P2P: Mediator destroyed."; | 1542 LOG(INFO) << "P2P: Mediator destroyed."; |
1678 } | 1543 } |
1679 | 1544 |
1680 // Pump any messages the auth watcher, syncer thread, or talk | 1545 // Pump any messages the auth watcher, syncer thread, or talk |
1681 // mediator posted before they shut down. (See HandleSyncerEvent(), | 1546 // mediator posted before they shut down. (See HandleSyncerEvent(), |
1682 // HandleAuthWatcherEvent(), and HandleTalkMediatorEvent() for the | 1547 // and HandleTalkMediatorEvent() for the |
1683 // events that may be posted.) | 1548 // events that may be posted.) |
1684 { | 1549 { |
1685 CHECK(core_message_loop_); | 1550 CHECK(core_message_loop_); |
1686 bool old_state = core_message_loop_->NestableTasksAllowed(); | 1551 bool old_state = core_message_loop_->NestableTasksAllowed(); |
1687 core_message_loop_->SetNestableTasksAllowed(true); | 1552 core_message_loop_->SetNestableTasksAllowed(true); |
1688 core_message_loop_->RunAllPending(); | 1553 core_message_loop_->RunAllPending(); |
1689 core_message_loop_->SetNestableTasksAllowed(old_state); | 1554 core_message_loop_->SetNestableTasksAllowed(old_state); |
1690 } | 1555 } |
1691 | 1556 |
1692 net::NetworkChangeNotifier::RemoveObserver(this); | 1557 net::NetworkChangeNotifier::RemoveObserver(this); |
1693 | 1558 |
| 1559 connection_manager_hookup_.reset(); |
| 1560 |
1694 if (dir_manager()) { | 1561 if (dir_manager()) { |
1695 dir_manager()->FinalSaveChangesForAll(); | 1562 dir_manager()->FinalSaveChangesForAll(); |
1696 dir_manager()->Close(username_for_share()); | 1563 dir_manager()->Close(username_for_share()); |
1697 } | 1564 } |
1698 | 1565 |
1699 // Reset the DirectoryManager and UserSettings so they relinquish sqlite | 1566 // Reset the DirectoryManager and UserSettings so they relinquish sqlite |
1700 // handles to backing files. | 1567 // handles to backing files. |
1701 share_.dir_manager.reset(); | 1568 share_.dir_manager.reset(); |
1702 user_settings_.reset(); | |
1703 | 1569 |
1704 // We don't want to process any more events. | 1570 // We don't want to process any more events. |
1705 dir_change_hookup_.reset(); | 1571 dir_change_hookup_.reset(); |
1706 | 1572 |
1707 core_message_loop_ = NULL; | 1573 core_message_loop_ = NULL; |
1708 } | 1574 } |
1709 | 1575 |
1710 void SyncManager::SyncInternal::OnIPAddressChanged() { | 1576 void SyncManager::SyncInternal::OnIPAddressChanged() { |
1711 LOG(INFO) << "IP address change detected"; | 1577 LOG(INFO) << "IP address change detected"; |
1712 // TODO(akalin): CheckServerReachable() can block, which may cause | 1578 // TODO(akalin): CheckServerReachable() can block, which may cause |
1713 // jank if we try to shut down sync. Fix this. | 1579 // jank if we try to shut down sync. Fix this. |
1714 connection_manager()->CheckServerReachable(); | 1580 connection_manager()->CheckServerReachable(); |
1715 } | 1581 sync_manager_->RequestNudge(); |
1716 | |
1717 void SyncManager::SyncInternal::HandleDirectoryManagerEvent( | |
1718 const syncable::DirectoryManagerEvent& event) { | |
1719 LOG(INFO) << "Sync internal handling a directory manager event"; | |
1720 if (syncable::DirectoryManagerEvent::OPENED == event.what_happened) { | |
1721 DCHECK(!initialized()) << "Should only happen once"; | |
1722 if (username_for_share().empty()) { | |
1723 share_.authenticated_name = event.dirname; | |
1724 } | |
1725 DCHECK(LowerCaseEqualsASCII(username_for_share(), | |
1726 StringToLowerASCII(event.dirname).c_str())) | |
1727 << "username_for_share= " << username_for_share() | |
1728 << ", event.dirname= " << event.dirname; | |
1729 MarkAndNotifyInitializationComplete(); | |
1730 } | |
1731 } | 1582 } |
1732 | 1583 |
1733 // Listen to model changes, filter out ones initiated by the sync API, and | 1584 // Listen to model changes, filter out ones initiated by the sync API, and |
1734 // saves the rest (hopefully just backend Syncer changes resulting from | 1585 // saves the rest (hopefully just backend Syncer changes resulting from |
1735 // ApplyUpdates) to data_->changelist. | 1586 // ApplyUpdates) to data_->changelist. |
1736 void SyncManager::SyncInternal::HandleChannelEvent( | 1587 void SyncManager::SyncInternal::HandleChannelEvent( |
1737 const syncable::DirectoryChangeEvent& event) { | 1588 const syncable::DirectoryChangeEvent& event) { |
1738 if (event.todo == syncable::DirectoryChangeEvent::TRANSACTION_ENDING) { | 1589 if (event.todo == syncable::DirectoryChangeEvent::TRANSACTION_ENDING) { |
1739 HandleTransactionEndingChangeEvent(event); | 1590 HandleTransactionEndingChangeEvent(event); |
1740 return; | 1591 return; |
1741 } else if (event.todo == syncable::DirectoryChangeEvent::CALCULATE_CHANGES) { | 1592 } else if (event.todo == syncable::DirectoryChangeEvent::CALCULATE_CHANGES) { |
1742 if (event.writer == syncable::SYNCAPI) { | 1593 if (event.writer == syncable::SYNCAPI) { |
1743 HandleCalculateChangesChangeEventFromSyncApi(event); | 1594 HandleCalculateChangesChangeEventFromSyncApi(event); |
1744 return; | 1595 return; |
1745 } | 1596 } |
1746 HandleCalculateChangesChangeEventFromSyncer(event); | 1597 HandleCalculateChangesChangeEventFromSyncer(event); |
1747 return; | 1598 return; |
1748 } else if (event.todo == syncable::DirectoryChangeEvent::SHUTDOWN) { | 1599 } else if (event.todo == syncable::DirectoryChangeEvent::SHUTDOWN) { |
1749 dir_change_hookup_.reset(); | 1600 dir_change_hookup_.reset(); |
1750 } | 1601 } |
1751 } | 1602 } |
1752 | 1603 |
| 1604 void SyncManager::SyncInternal::HandleServerConnectionEvent( |
| 1605 const ServerConnectionEvent& event) { |
| 1606 allstatus_.HandleServerConnectionEvent(event); |
| 1607 if (event.what_happened == ServerConnectionEvent::STATUS_CHANGED) { |
| 1608 if (event.connection_code == |
| 1609 browser_sync::HttpResponse::SERVER_CONNECTION_OK) { |
| 1610 if (observer_) { |
| 1611 observer_->OnAuthError(AuthError(AuthError::None())); |
| 1612 } |
| 1613 } |
| 1614 |
| 1615 if (event.connection_code == browser_sync::HttpResponse::SYNC_AUTH_ERROR) { |
| 1616 if (observer_) { |
| 1617 observer_->OnAuthError(AuthError(AuthError::INVALID_GAIA_CREDENTIALS)); |
| 1618 } |
| 1619 } |
| 1620 } |
| 1621 } |
| 1622 |
1753 void SyncManager::SyncInternal::HandleTransactionEndingChangeEvent( | 1623 void SyncManager::SyncInternal::HandleTransactionEndingChangeEvent( |
1754 const syncable::DirectoryChangeEvent& event) { | 1624 const syncable::DirectoryChangeEvent& event) { |
1755 // This notification happens immediately before a syncable WriteTransaction | 1625 // This notification happens immediately before a syncable WriteTransaction |
1756 // falls out of scope. It happens while the channel mutex is still held, | 1626 // falls out of scope. It happens while the channel mutex is still held, |
1757 // and while the transaction mutex is held, so it cannot be re-entrant. | 1627 // and while the transaction mutex is held, so it cannot be re-entrant. |
1758 DCHECK_EQ(event.todo, syncable::DirectoryChangeEvent::TRANSACTION_ENDING); | 1628 DCHECK_EQ(event.todo, syncable::DirectoryChangeEvent::TRANSACTION_ENDING); |
1759 if (!observer_ || ChangeBuffersAreEmpty()) | 1629 if (!observer_ || ChangeBuffersAreEmpty()) |
1760 return; | 1630 return; |
1761 | 1631 |
1762 // This will continue the WriteTransaction using a read only wrapper. | 1632 // This will continue the WriteTransaction using a read only wrapper. |
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1974 | 1844 |
1975 if (event.what_happened == SyncerEvent::RESUMED) { | 1845 if (event.what_happened == SyncerEvent::RESUMED) { |
1976 observer_->OnResumed(); | 1846 observer_->OnResumed(); |
1977 return; | 1847 return; |
1978 } | 1848 } |
1979 | 1849 |
1980 if (event.what_happened == SyncerEvent::STOP_SYNCING_PERMANENTLY) { | 1850 if (event.what_happened == SyncerEvent::STOP_SYNCING_PERMANENTLY) { |
1981 observer_->OnStopSyncingPermanently(); | 1851 observer_->OnStopSyncingPermanently(); |
1982 return; | 1852 return; |
1983 } | 1853 } |
| 1854 |
| 1855 if (event.what_happened == SyncerEvent::UPDATED_TOKEN) { |
| 1856 observer_->OnUpdatedToken(event.updated_token); |
| 1857 return; |
| 1858 } |
1984 } | 1859 } |
1985 | 1860 |
1986 void SyncManager::SyncInternal::HandleAuthWatcherEvent( | |
1987 const AuthWatcherEvent& event) { | |
1988 allstatus_.HandleAuthWatcherEvent(event); | |
1989 // We don't care about an authentication attempt starting event, and we | |
1990 // don't want to reset our state to GoogleServiceAuthError::NONE because the | |
1991 // fact that an _attempt_ is starting doesn't change the fact that we have an | |
1992 // auth problem. | |
1993 if (event.what_happened == AuthWatcherEvent::AUTHENTICATION_ATTEMPT_START) | |
1994 return; | |
1995 // We clear our last auth problem cache on new auth watcher events, and only | |
1996 // set it to indicate a problem state for certain AuthWatcherEvent types. | |
1997 auth_problem_ = AuthError::NONE; | |
1998 switch (event.what_happened) { | |
1999 case AuthWatcherEvent::AUTH_SUCCEEDED: | |
2000 DCHECK(!event.user_email.empty()); | |
2001 // We now know the supplied username and password were valid. If this | |
2002 // wasn't the first sync, authenticated_name should already be assigned. | |
2003 if (username_for_share().empty()) { | |
2004 share_.authenticated_name = event.user_email; | |
2005 } | |
2006 | |
2007 DCHECK(LowerCaseEqualsASCII(username_for_share(), | |
2008 StringToLowerASCII(event.user_email).c_str())) | |
2009 << "username_for_share= " << username_for_share() | |
2010 << ", event.user_email= " << event.user_email; | |
2011 | |
2012 if (observer_) | |
2013 observer_->OnAuthError(AuthError::None()); | |
2014 | |
2015 // Hook up the DirectoryChangeEvent listener, HandleChangeEvent. | |
2016 { | |
2017 syncable::ScopedDirLookup lookup(dir_manager(), username_for_share()); | |
2018 if (!lookup.good()) { | |
2019 DCHECK(false) << "ScopedDirLookup creation failed; unable to hook " | |
2020 << "up directory change event listener!"; | |
2021 return; | |
2022 } | |
2023 | |
2024 // Note that we can end up here multiple times, for example if the | |
2025 // user had to re-login and we got a second AUTH_SUCCEEDED event. Take | |
2026 // care not to add ourselves as an observer a second time. | |
2027 if (!dir_change_hookup_.get()) | |
2028 dir_change_hookup_.reset(lookup->AddChangeObserver(this)); | |
2029 } | |
2030 | |
2031 if (!event.auth_token.empty()) { | |
2032 core_message_loop_->PostTask( | |
2033 FROM_HERE, | |
2034 NewRunnableMethod( | |
2035 this, &SyncManager::SyncInternal::TalkMediatorLogin, | |
2036 event.user_email, event.auth_token)); | |
2037 } | |
2038 return; | |
2039 case AuthWatcherEvent::AUTH_RENEWED: | |
2040 DCHECK(!event.user_email.empty()); | |
2041 DCHECK(!event.auth_token.empty()); | |
2042 core_message_loop_->PostTask( | |
2043 FROM_HERE, | |
2044 NewRunnableMethod( | |
2045 this, &SyncManager::SyncInternal::TalkMediatorLogin, | |
2046 event.user_email, event.auth_token)); | |
2047 return; | |
2048 // Authentication failures translate to GoogleServiceAuthError events. | |
2049 case AuthWatcherEvent::GAIA_AUTH_FAILED: // Invalid GAIA credentials. | |
2050 if (event.auth_results->auth_error == gaia::CaptchaRequired) { | |
2051 auth_problem_ = AuthError::CAPTCHA_REQUIRED; | |
2052 std::string url_string("https://www.google.com/accounts/"); | |
2053 url_string += event.auth_results->captcha_url; | |
2054 GURL captcha(url_string); | |
2055 observer_->OnAuthError(AuthError::FromCaptchaChallenge( | |
2056 event.auth_results->captcha_token, captcha, | |
2057 GURL(event.auth_results->auth_error_url))); | |
2058 return; | |
2059 } else if (event.auth_results->auth_error == | |
2060 gaia::ConnectionUnavailable) { | |
2061 auth_problem_ = AuthError::CONNECTION_FAILED; | |
2062 } else { | |
2063 auth_problem_ = AuthError::INVALID_GAIA_CREDENTIALS; | |
2064 } | |
2065 break; | |
2066 case AuthWatcherEvent::SERVICE_AUTH_FAILED: // Expired GAIA credentials. | |
2067 auth_problem_ = AuthError::INVALID_GAIA_CREDENTIALS; | |
2068 break; | |
2069 case AuthWatcherEvent::SERVICE_USER_NOT_SIGNED_UP: | |
2070 auth_problem_ = AuthError::USER_NOT_SIGNED_UP; | |
2071 break; | |
2072 case AuthWatcherEvent::SERVICE_CONNECTION_FAILED: | |
2073 auth_problem_ = AuthError::CONNECTION_FAILED; | |
2074 break; | |
2075 default: // We don't care about the many other AuthWatcherEvent types. | |
2076 return; | |
2077 } | |
2078 | |
2079 | |
2080 // Fire notification that the status changed due to an authentication error. | |
2081 if (observer_) | |
2082 observer_->OnAuthError(AuthError(auth_problem_)); | |
2083 } | |
2084 | |
2085 void SyncManager::SyncInternal::OnNotificationStateChange( | 1861 void SyncManager::SyncInternal::OnNotificationStateChange( |
2086 bool notifications_enabled) { | 1862 bool notifications_enabled) { |
2087 LOG(INFO) << "P2P: Notifications enabled = " | 1863 LOG(INFO) << "P2P: Notifications enabled = " |
2088 << (notifications_enabled ? "true" : "false"); | 1864 << (notifications_enabled ? "true" : "false"); |
2089 allstatus_.SetNotificationsEnabled(notifications_enabled); | 1865 allstatus_.SetNotificationsEnabled(notifications_enabled); |
2090 if (syncer_thread()) { | 1866 if (syncer_thread()) { |
2091 syncer_thread()->SetNotificationsEnabled(notifications_enabled); | 1867 syncer_thread()->SetNotificationsEnabled(notifications_enabled); |
2092 } | 1868 } |
2093 if ((notification_method_ != browser_sync::NOTIFICATION_SERVER) && | 1869 if ((notification_method_ != browser_sync::NOTIFICATION_SERVER) && |
2094 notifications_enabled) { | 1870 notifications_enabled) { |
(...skipping 19 matching lines...) Expand all Loading... |
2114 void SyncManager::SyncInternal::TalkMediatorLogin( | 1890 void SyncManager::SyncInternal::TalkMediatorLogin( |
2115 const std::string& email, const std::string& token) { | 1891 const std::string& email, const std::string& token) { |
2116 DCHECK_EQ(MessageLoop::current(), core_message_loop_); | 1892 DCHECK_EQ(MessageLoop::current(), core_message_loop_); |
2117 DCHECK(!email.empty()); | 1893 DCHECK(!email.empty()); |
2118 DCHECK(!token.empty()); | 1894 DCHECK(!token.empty()); |
2119 if (!talk_mediator_.get()) { | 1895 if (!talk_mediator_.get()) { |
2120 LOG(INFO) << "Not logging in: shutting down " | 1896 LOG(INFO) << "Not logging in: shutting down " |
2121 << "(talk_mediator_ is NULL)"; | 1897 << "(talk_mediator_ is NULL)"; |
2122 return; | 1898 return; |
2123 } | 1899 } |
2124 // TODO(akalin): Make talk_mediator automatically login on | 1900 LOG(INFO) << "P2P: Trying talk mediator login."; |
2125 // auth token change. | 1901 |
2126 talk_mediator_->SetAuthToken(email, token, SYNC_SERVICE_NAME); | 1902 talk_mediator_->SetAuthToken(email, token, SYNC_SERVICE_NAME); |
2127 talk_mediator_->Login(); | 1903 talk_mediator_->Login(); |
2128 } | 1904 } |
2129 | 1905 |
2130 void SyncManager::SyncInternal::OnIncomingNotification( | 1906 void SyncManager::SyncInternal::OnIncomingNotification( |
2131 const IncomingNotificationData& notification_data) { | 1907 const IncomingNotificationData& notification_data) { |
2132 // Check if the service url is a sync URL. An empty service URL is | 1908 // Check if the service url is a sync URL. An empty service URL is |
2133 // treated as a legacy sync notification. If we're listening to | 1909 // treated as a legacy sync notification. If we're listening to |
2134 // server-issued notifications, no need to check the service_url. | 1910 // server-issued notifications, no need to check the service_url. |
2135 if ((notification_method_ == browser_sync::NOTIFICATION_SERVER) || | 1911 if ((notification_method_ == browser_sync::NOTIFICATION_SERVER) || |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2177 lookup->SaveChanges(); | 1953 lookup->SaveChanges(); |
2178 } | 1954 } |
2179 | 1955 |
2180 void SyncManager::SetupForTestMode(const std::wstring& test_username) { | 1956 void SyncManager::SetupForTestMode(const std::wstring& test_username) { |
2181 DCHECK(data_) << "SetupForTestMode requires initialization"; | 1957 DCHECK(data_) << "SetupForTestMode requires initialization"; |
2182 data_->SetupForTestMode(test_username); | 1958 data_->SetupForTestMode(test_username); |
2183 } | 1959 } |
2184 | 1960 |
2185 void SyncManager::SyncInternal::SetupForTestMode( | 1961 void SyncManager::SyncInternal::SetupForTestMode( |
2186 const std::wstring& test_username) { | 1962 const std::wstring& test_username) { |
2187 share_.authenticated_name = WideToUTF8(test_username); | 1963 share_.name = WideToUTF8(test_username); |
2188 | 1964 |
2189 // Some tests are targeting only local db operations & integrity, and don't | 1965 // Some tests are targeting only local db operations & integrity, and don't |
2190 // want syncer thread interference. | 1966 // want syncer thread interference. |
2191 syncer_event_.reset(); | 1967 syncer_event_.reset(); |
2192 allstatus_.WatchSyncerThread(NULL); | 1968 allstatus_.WatchSyncerThread(NULL); |
2193 syncer_thread_ = NULL; | 1969 syncer_thread_ = NULL; |
2194 | 1970 |
2195 if (!dir_manager()->Open(username_for_share())) | 1971 if (!dir_manager()->Open(username_for_share())) { |
2196 DCHECK(false) << "Could not open directory when running in test mode"; | 1972 DCHECK(false) << "Could not open directory when running in test mode"; |
2197 | |
2198 // Hook up the DirectoryChangeEvent listener, HandleChangeEvent. | |
2199 { | |
2200 syncable::ScopedDirLookup lookup(dir_manager(), username_for_share()); | |
2201 if (!lookup.good()) { | |
2202 DCHECK(false) << "ScopedDirLookup creation failed; unable to hook " | |
2203 << "up directory change event listener!"; | |
2204 return; | |
2205 } | |
2206 dir_change_hookup_.reset(lookup->AddChangeObserver(this)); | |
2207 } | 1973 } |
2208 } | 1974 } |
2209 | 1975 |
2210 ////////////////////////////////////////////////////////////////////////// | 1976 ////////////////////////////////////////////////////////////////////////// |
2211 // BaseTransaction member definitions | 1977 // BaseTransaction member definitions |
2212 BaseTransaction::BaseTransaction(UserShare* share) | 1978 BaseTransaction::BaseTransaction(UserShare* share) |
2213 : lookup_(NULL) { | 1979 : lookup_(NULL) { |
2214 DCHECK(share && share->dir_manager.get()); | 1980 DCHECK(share && share->dir_manager.get()); |
2215 lookup_ = new syncable::ScopedDirLookup(share->dir_manager.get(), | 1981 lookup_ = new syncable::ScopedDirLookup(share->dir_manager.get(), |
2216 share->authenticated_name); | 1982 share->name); |
2217 cryptographer_ = share->dir_manager->cryptographer(); | 1983 cryptographer_ = share->dir_manager->cryptographer(); |
2218 if (!(lookup_->good())) | 1984 if (!(lookup_->good())) |
2219 DCHECK(false) << "ScopedDirLookup failed on valid DirManager."; | 1985 DCHECK(false) << "ScopedDirLookup failed on valid DirManager."; |
2220 } | 1986 } |
2221 BaseTransaction::~BaseTransaction() { | 1987 BaseTransaction::~BaseTransaction() { |
2222 delete lookup_; | 1988 delete lookup_; |
2223 } | 1989 } |
2224 | 1990 |
2225 UserShare* SyncManager::GetUserShare() const { | 1991 UserShare* SyncManager::GetUserShare() const { |
2226 DCHECK(data_->initialized()) << "GetUserShare requires initialization!"; | 1992 DCHECK(data_->initialized()) << "GetUserShare requires initialization!"; |
2227 return data_->GetUserShare(); | 1993 return data_->GetUserShare(); |
2228 } | 1994 } |
2229 | 1995 |
2230 bool SyncManager::HasUnsyncedItems() const { | 1996 bool SyncManager::HasUnsyncedItems() const { |
2231 sync_api::ReadTransaction trans(GetUserShare()); | 1997 sync_api::ReadTransaction trans(GetUserShare()); |
2232 return (trans.GetWrappedTrans()->directory()->unsynced_entity_count() != 0); | 1998 return (trans.GetWrappedTrans()->directory()->unsynced_entity_count() != 0); |
2233 } | 1999 } |
2234 | 2000 |
2235 } // namespace sync_api | 2001 } // namespace sync_api |
OLD | NEW |