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

Side by Side Diff: chrome/browser/sync/glue/sync_backend_host.cc

Issue 3305003: New authorization framework for sync. ... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 10 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 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 "build/build_config.h" 5 #include "build/build_config.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/file_util.h" 9 #include "base/file_util.h"
10 #include "base/task.h" 10 #include "base/task.h"
11 #include "base/utf_string_conversions.h" 11 #include "base/utf_string_conversions.h"
12 #include "chrome/browser/chrome_thread.h" 12 #include "chrome/browser/chrome_thread.h"
13 #include "chrome/browser/net/gaia/token_service.h"
13 #include "chrome/browser/prefs/pref_service.h" 14 #include "chrome/browser/prefs/pref_service.h"
14 #include "chrome/browser/profile.h" 15 #include "chrome/browser/profile.h"
15 #include "chrome/browser/sync/engine/syncapi.h" 16 #include "chrome/browser/sync/engine/syncapi.h"
16 #include "chrome/browser/sync/glue/change_processor.h" 17 #include "chrome/browser/sync/glue/change_processor.h"
17 #include "chrome/browser/sync/glue/database_model_worker.h" 18 #include "chrome/browser/sync/glue/database_model_worker.h"
18 #include "chrome/browser/sync/glue/history_model_worker.h" 19 #include "chrome/browser/sync/glue/history_model_worker.h"
19 #include "chrome/browser/sync/glue/sync_backend_host.h" 20 #include "chrome/browser/sync/glue/sync_backend_host.h"
20 #include "chrome/browser/sync/glue/http_bridge.h" 21 #include "chrome/browser/sync/glue/http_bridge.h"
21 #include "chrome/browser/sync/glue/password_model_worker.h" 22 #include "chrome/browser/sync/glue/password_model_worker.h"
22 #include "chrome/browser/sync/sessions/session_state.h" 23 #include "chrome/browser/sync/sessions/session_state.h"
23 #include "chrome/common/chrome_version_info.h" 24 #include "chrome/common/chrome_version_info.h"
25 #include "chrome/common/net/gaia/gaia_constants.h"
24 #include "chrome/common/notification_service.h" 26 #include "chrome/common/notification_service.h"
25 #include "chrome/common/notification_type.h" 27 #include "chrome/common/notification_type.h"
26 #include "chrome/common/pref_names.h" 28 #include "chrome/common/pref_names.h"
27 #include "webkit/glue/webkit_glue.h" 29 #include "webkit/glue/webkit_glue.h"
28 30
29 static const int kSaveChangesIntervalSeconds = 10; 31 static const int kSaveChangesIntervalSeconds = 10;
30 static const char kGaiaServiceId[] = "chromiumsync";
31 static const char kGaiaSourceForChrome[] = "ChromiumBrowser";
32 static const FilePath::CharType kSyncDataFolderName[] = 32 static const FilePath::CharType kSyncDataFolderName[] =
33 FILE_PATH_LITERAL("Sync Data"); 33 FILE_PATH_LITERAL("Sync Data");
34 34
35 using browser_sync::DataTypeController; 35 using browser_sync::DataTypeController;
36 typedef TokenService::TokenAvailableDetails TokenAvailableDetails;
36 37
37 typedef GoogleServiceAuthError AuthError; 38 typedef GoogleServiceAuthError AuthError;
38 39
39 namespace browser_sync { 40 namespace browser_sync {
40 41
41 using sessions::SyncSessionSnapshot; 42 using sessions::SyncSessionSnapshot;
43 using sync_api::SyncCredentials;
42 44
43 SyncBackendHost::SyncBackendHost( 45 SyncBackendHost::SyncBackendHost(
44 SyncFrontend* frontend, 46 SyncFrontend* frontend,
45 Profile* profile, 47 Profile* profile,
46 const FilePath& profile_path, 48 const FilePath& profile_path,
47 const DataTypeController::TypeMap& data_type_controllers) 49 const DataTypeController::TypeMap& data_type_controllers)
48 : core_thread_("Chrome_SyncCoreThread"), 50 : core_thread_("Chrome_SyncCoreThread"),
49 frontend_loop_(MessageLoop::current()), 51 frontend_loop_(MessageLoop::current()),
50 profile_(profile), 52 profile_(profile),
51 frontend_(frontend), 53 frontend_(frontend),
(...skipping 16 matching lines...) Expand all
68 70
69 SyncBackendHost::~SyncBackendHost() { 71 SyncBackendHost::~SyncBackendHost() {
70 DCHECK(!core_ && !frontend_) << "Must call Shutdown before destructor."; 72 DCHECK(!core_ && !frontend_) << "Must call Shutdown before destructor.";
71 DCHECK(registrar_.workers.empty()); 73 DCHECK(registrar_.workers.empty());
72 } 74 }
73 75
74 void SyncBackendHost::Initialize( 76 void SyncBackendHost::Initialize(
75 const GURL& sync_service_url, 77 const GURL& sync_service_url,
76 const syncable::ModelTypeSet& types, 78 const syncable::ModelTypeSet& types,
77 URLRequestContextGetter* baseline_context_getter, 79 URLRequestContextGetter* baseline_context_getter,
78 const std::string& lsid, 80 const SyncCredentials& credentials,
79 bool delete_sync_data_folder, 81 bool delete_sync_data_folder,
80 bool invalidate_sync_login,
81 bool invalidate_sync_xmpp_login,
82 bool use_chrome_async_socket, 82 bool use_chrome_async_socket,
83 bool try_ssltcp_first, 83 bool try_ssltcp_first,
84 NotificationMethod notification_method) { 84 NotificationMethod notification_method) {
85 if (!core_thread_.Start()) 85 if (!core_thread_.Start())
86 return; 86 return;
87 87
88 // Create a worker for the UI thread and route bookmark changes to it. 88 // Create a worker for the UI thread and route bookmark changes to it.
89 // TODO(tim): Pull this into a method to reuse. For now we don't even 89 // TODO(tim): Pull this into a method to reuse. For now we don't even
90 // need to lock because we init before the syncapi exists and we tear down 90 // need to lock because we init before the syncapi exists and we tear down
91 // after the syncapi is destroyed. Make sure to NULL-check workers_ indices 91 // after the syncapi is destroyed. Make sure to NULL-check workers_ indices
(...skipping 11 matching lines...) Expand all
103 103
104 // Any datatypes that we want the syncer to pull down must 104 // Any datatypes that we want the syncer to pull down must
105 // be in the routing_info map. We set them to group passive, meaning that 105 // be in the routing_info map. We set them to group passive, meaning that
106 // updates will be applied, but not dispatched to the UI thread yet. 106 // updates will be applied, but not dispatched to the UI thread yet.
107 for (syncable::ModelTypeSet::const_iterator it = types.begin(); 107 for (syncable::ModelTypeSet::const_iterator it = types.begin();
108 it != types.end(); ++it) { 108 it != types.end(); ++it) {
109 registrar_.routing_info[(*it)] = GROUP_PASSIVE; 109 registrar_.routing_info[(*it)] = GROUP_PASSIVE;
110 } 110 }
111 111
112 InitCore(Core::DoInitializeOptions( 112 InitCore(Core::DoInitializeOptions(
113 sync_service_url, lsid.empty(), 113 sync_service_url,
114 MakeHttpBridgeFactory(baseline_context_getter), 114 MakeHttpBridgeFactory(baseline_context_getter),
115 MakeHttpBridgeFactory(baseline_context_getter), 115 credentials,
116 lsid,
117 delete_sync_data_folder, 116 delete_sync_data_folder,
118 invalidate_sync_login,
119 invalidate_sync_xmpp_login,
120 use_chrome_async_socket, 117 use_chrome_async_socket,
121 try_ssltcp_first, 118 try_ssltcp_first,
122 notification_method, 119 notification_method,
123 RestoreEncryptionBootstrapToken())); 120 RestoreEncryptionBootstrapToken()));
124 } 121 }
125 122
126 void SyncBackendHost::PersistEncryptionBootstrapToken( 123 void SyncBackendHost::PersistEncryptionBootstrapToken(
127 const std::string& token) { 124 const std::string& token) {
128 PrefService* prefs = profile_->GetPrefs(); 125 PrefService* prefs = profile_->GetPrefs();
129 126
(...skipping 11 matching lines...) Expand all
141 URLRequestContextGetter* getter) { 138 URLRequestContextGetter* getter) {
142 return new HttpBridgeFactory(getter); 139 return new HttpBridgeFactory(getter);
143 } 140 }
144 141
145 void SyncBackendHost::InitCore(const Core::DoInitializeOptions& options) { 142 void SyncBackendHost::InitCore(const Core::DoInitializeOptions& options) {
146 core_thread_.message_loop()->PostTask(FROM_HERE, 143 core_thread_.message_loop()->PostTask(FROM_HERE,
147 NewRunnableMethod(core_.get(), &SyncBackendHost::Core::DoInitialize, 144 NewRunnableMethod(core_.get(), &SyncBackendHost::Core::DoInitialize,
148 options)); 145 options));
149 } 146 }
150 147
151 void SyncBackendHost::Authenticate(const std::string& username, 148 void SyncBackendHost::UpdateCredentials(const SyncCredentials& credentials) {
152 const std::string& password,
153 const std::string& captcha) {
154 core_thread_.message_loop()->PostTask(FROM_HERE, 149 core_thread_.message_loop()->PostTask(FROM_HERE,
155 NewRunnableMethod(core_.get(), &SyncBackendHost::Core::DoAuthenticate, 150 NewRunnableMethod(core_.get(),
156 username, password, captcha)); 151 &SyncBackendHost::Core::DoUpdateCredentials,
152 credentials));
157 } 153 }
158 154
159 void SyncBackendHost::StartSyncingWithServer() { 155 void SyncBackendHost::StartSyncingWithServer() {
160 core_thread_.message_loop()->PostTask(FROM_HERE, 156 core_thread_.message_loop()->PostTask(FROM_HERE,
161 NewRunnableMethod(core_.get(), &SyncBackendHost::Core::DoStartSyncing)); 157 NewRunnableMethod(core_.get(), &SyncBackendHost::Core::DoStartSyncing));
162 } 158 }
163 159
164 void SyncBackendHost::SetPassphrase(const std::string& passphrase) { 160 void SyncBackendHost::SetPassphrase(const std::string& passphrase) {
165 core_thread_.message_loop()->PostTask(FROM_HERE, 161 core_thread_.message_loop()->PostTask(FROM_HERE,
166 NewRunnableMethod(core_.get(), &SyncBackendHost::Core::DoSetPassphrase, 162 NewRunnableMethod(core_.get(), &SyncBackendHost::Core::DoSetPassphrase,
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
337 333
338 void SyncBackendHost::Core::NotifyPassphraseAccepted( 334 void SyncBackendHost::Core::NotifyPassphraseAccepted(
339 const std::string& bootstrap_token) { 335 const std::string& bootstrap_token) {
340 host_->PersistEncryptionBootstrapToken(bootstrap_token); 336 host_->PersistEncryptionBootstrapToken(bootstrap_token);
341 NotificationService::current()->Notify( 337 NotificationService::current()->Notify(
342 NotificationType::SYNC_PASSPHRASE_ACCEPTED, 338 NotificationType::SYNC_PASSPHRASE_ACCEPTED,
343 NotificationService::AllSources(), 339 NotificationService::AllSources(),
344 NotificationService::NoDetails()); 340 NotificationService::NoDetails());
345 } 341 }
346 342
343 void SyncBackendHost::Core::NotifyUpdatedToken(const std::string& token) {
344 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
345 TokenAvailableDetails details(GaiaConstants::kSyncService, token);
346 NotificationService::current()->Notify(
347 NotificationType::TOKEN_UPDATED,
348 NotificationService::AllSources(),
349 Details<const TokenAvailableDetails>(&details));
350 }
351
347 SyncBackendHost::UserShareHandle SyncBackendHost::GetUserShareHandle() const { 352 SyncBackendHost::UserShareHandle SyncBackendHost::GetUserShareHandle() const {
348 DCHECK(syncapi_initialized_); 353 DCHECK(syncapi_initialized_);
349 return core_->syncapi()->GetUserShare(); 354 return core_->syncapi()->GetUserShare();
350 } 355 }
351 356
352 SyncBackendHost::Status SyncBackendHost::GetDetailedStatus() { 357 SyncBackendHost::Status SyncBackendHost::GetDetailedStatus() {
353 DCHECK(syncapi_initialized_); 358 DCHECK(syncapi_initialized_);
354 return core_->syncapi()->GetDetailedStatus(); 359 return core_->syncapi()->GetDetailedStatus();
355 } 360 }
356 361
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
425 if (!version_info.IsOfficialBuild()) 430 if (!version_info.IsOfficialBuild())
426 user_agent += "-devel"; 431 user_agent += "-devel";
427 return user_agent; 432 return user_agent;
428 } 433 }
429 434
430 void SyncBackendHost::Core::DoInitialize(const DoInitializeOptions& options) { 435 void SyncBackendHost::Core::DoInitialize(const DoInitializeOptions& options) {
431 DCHECK(MessageLoop::current() == host_->core_thread_.message_loop()); 436 DCHECK(MessageLoop::current() == host_->core_thread_.message_loop());
432 437
433 // Blow away the partial or corrupt sync data folder before doing any more 438 // Blow away the partial or corrupt sync data folder before doing any more
434 // initialization, if necessary. 439 // initialization, if necessary.
435 if (options.delete_sync_data_folder) 440 if (options.delete_sync_data_folder) {
436 DeleteSyncDataFolder(); 441 DeleteSyncDataFolder();
442 }
437 443
438 // Make sure that the directory exists before initializing the backend. 444 // Make sure that the directory exists before initializing the backend.
439 // If it already exists, this will do no harm. 445 // If it already exists, this will do no harm.
440 bool success = file_util::CreateDirectory(host_->sync_data_folder_path()); 446 bool success = file_util::CreateDirectory(host_->sync_data_folder_path());
441 DCHECK(success); 447 DCHECK(success);
442 448
443 syncapi_->SetObserver(this); 449 syncapi_->SetObserver(this);
444 const FilePath& path_str = host_->sync_data_folder_path(); 450 const FilePath& path_str = host_->sync_data_folder_path();
445 success = syncapi_->Init(path_str, 451 success = syncapi_->Init(path_str,
446 (options.service_url.host() + options.service_url.path()).c_str(), 452 (options.service_url.host() + options.service_url.path()).c_str(),
447 options.service_url.EffectiveIntPort(), 453 options.service_url.EffectiveIntPort(),
448 kGaiaServiceId,
449 kGaiaSourceForChrome,
450 options.service_url.SchemeIsSecure(), 454 options.service_url.SchemeIsSecure(),
451 options.http_bridge_factory, 455 options.http_bridge_factory,
452 options.auth_http_bridge_factory,
453 host_, // ModelSafeWorkerRegistrar. 456 host_, // ModelSafeWorkerRegistrar.
454 options.attempt_last_user_authentication,
455 options.invalidate_sync_login,
456 options.invalidate_sync_xmpp_login,
457 MakeUserAgentForSyncapi().c_str(), 457 MakeUserAgentForSyncapi().c_str(),
458 options.lsid.c_str(), 458 options.credentials,
459 options.use_chrome_async_socket, 459 options.use_chrome_async_socket,
460 options.try_ssltcp_first, 460 options.try_ssltcp_first,
461 options.notification_method, 461 options.notification_method,
462 options.restored_key_for_bootstrapping); 462 options.restored_key_for_bootstrapping);
463 DCHECK(success) << "Syncapi initialization failed!"; 463 DCHECK(success) << "Syncapi initialization failed!";
464 } 464 }
465 465
466 void SyncBackendHost::Core::DoAuthenticate(const std::string& username, 466 void SyncBackendHost::Core::DoUpdateCredentials(
467 const std::string& password, 467 const SyncCredentials& credentials) {
468 const std::string& captcha) {
469 DCHECK(MessageLoop::current() == host_->core_thread_.message_loop()); 468 DCHECK(MessageLoop::current() == host_->core_thread_.message_loop());
470 syncapi_->Authenticate(username.c_str(), password.c_str(), captcha.c_str()); 469 syncapi_->UpdateCredentials(credentials);
471 } 470 }
472 471
473 void SyncBackendHost::Core::DoStartSyncing() { 472 void SyncBackendHost::Core::DoStartSyncing() {
474 DCHECK(MessageLoop::current() == host_->core_thread_.message_loop()); 473 DCHECK(MessageLoop::current() == host_->core_thread_.message_loop());
475 syncapi_->StartSyncing(); 474 syncapi_->StartSyncing();
476 } 475 }
477 476
478 void SyncBackendHost::Core::DoSetPassphrase(const std::string& passphrase) { 477 void SyncBackendHost::Core::DoSetPassphrase(const std::string& passphrase) {
479 DCHECK(MessageLoop::current() == host_->core_thread_.message_loop()); 478 DCHECK(MessageLoop::current() == host_->core_thread_.message_loop());
480 syncapi_->SetPassphrase(passphrase); 479 syncapi_->SetPassphrase(passphrase);
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
617 browser_sync::ModelSafeGroup group = routing_it->second; 616 browser_sync::ModelSafeGroup group = routing_it->second;
618 WorkerMap::const_iterator worker_it = host_->registrar_.workers.find(group); 617 WorkerMap::const_iterator worker_it = host_->registrar_.workers.find(group);
619 if (worker_it == host_->registrar_.workers.end()) 618 if (worker_it == host_->registrar_.workers.end())
620 return false; 619 return false;
621 ModelSafeWorker* worker = worker_it->second; 620 ModelSafeWorker* worker = worker_it->second;
622 return worker->CurrentThreadIsWorkThread(); 621 return worker->CurrentThreadIsWorkThread();
623 } 622 }
624 623
625 624
626 void SyncBackendHost::Core::OnAuthError(const AuthError& auth_error) { 625 void SyncBackendHost::Core::OnAuthError(const AuthError& auth_error) {
627 // We could be on SyncEngine_AuthWatcherThread. Post to our core loop so 626 // Post to our core loop so we can modify state. Could be on another thread.
628 // we can modify state.
629 host_->frontend_loop_->PostTask(FROM_HERE, 627 host_->frontend_loop_->PostTask(FROM_HERE,
630 NewRunnableMethod(this, &Core::HandleAuthErrorEventOnFrontendLoop, 628 NewRunnableMethod(this, &Core::HandleAuthErrorEventOnFrontendLoop,
631 auth_error)); 629 auth_error));
632 } 630 }
633 631
634 void SyncBackendHost::Core::OnPassphraseRequired() { 632 void SyncBackendHost::Core::OnPassphraseRequired() {
635 host_->frontend_loop_->PostTask(FROM_HERE, 633 host_->frontend_loop_->PostTask(FROM_HERE,
636 NewRunnableMethod(this, &Core::NotifyPassphraseRequired)); 634 NewRunnableMethod(this, &Core::NotifyPassphraseRequired));
637 } 635 }
638 636
(...skipping 14 matching lines...) Expand all
653 host_->frontend_loop_->PostTask( 651 host_->frontend_loop_->PostTask(
654 FROM_HERE, 652 FROM_HERE,
655 NewRunnableMethod(this, &Core::NotifyResumed)); 653 NewRunnableMethod(this, &Core::NotifyResumed));
656 } 654 }
657 655
658 void SyncBackendHost::Core::OnStopSyncingPermanently() { 656 void SyncBackendHost::Core::OnStopSyncingPermanently() {
659 host_->frontend_loop_->PostTask(FROM_HERE, NewRunnableMethod(this, 657 host_->frontend_loop_->PostTask(FROM_HERE, NewRunnableMethod(this,
660 &Core::HandleStopSyncingPermanentlyOnFrontendLoop)); 658 &Core::HandleStopSyncingPermanentlyOnFrontendLoop));
661 } 659 }
662 660
661 void SyncBackendHost::Core::OnUpdatedToken(const std::string& token) {
662 host_->frontend_loop_->PostTask(FROM_HERE, NewRunnableMethod(this,
663 &Core::NotifyUpdatedToken, token));
664 }
665
663 void SyncBackendHost::Core::HandleStopSyncingPermanentlyOnFrontendLoop() { 666 void SyncBackendHost::Core::HandleStopSyncingPermanentlyOnFrontendLoop() {
664 if (!host_ || !host_->frontend_) 667 if (!host_ || !host_->frontend_)
665 return; 668 return;
666 host_->frontend_->OnStopSyncingPermanently(); 669 host_->frontend_->OnStopSyncingPermanently();
667 } 670 }
668 671
669 void SyncBackendHost::Core::HandleAuthErrorEventOnFrontendLoop( 672 void SyncBackendHost::Core::HandleAuthErrorEventOnFrontendLoop(
670 const GoogleServiceAuthError& new_auth_error) { 673 const GoogleServiceAuthError& new_auth_error) {
671 if (!host_ || !host_->frontend_) 674 if (!host_ || !host_->frontend_)
672 return; 675 return;
(...skipping 27 matching lines...) Expand all
700 } 703 }
701 704
702 void SyncBackendHost::Core::DeleteSyncDataFolder() { 705 void SyncBackendHost::Core::DeleteSyncDataFolder() {
703 if (file_util::DirectoryExists(host_->sync_data_folder_path())) { 706 if (file_util::DirectoryExists(host_->sync_data_folder_path())) {
704 if (!file_util::Delete(host_->sync_data_folder_path(), true)) 707 if (!file_util::Delete(host_->sync_data_folder_path(), true))
705 LOG(DFATAL) << "Could not delete the Sync Data folder."; 708 LOG(DFATAL) << "Could not delete the Sync Data folder.";
706 } 709 }
707 } 710 }
708 711
709 } // namespace browser_sync 712 } // namespace browser_sync
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698