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

Unified Diff: chrome/browser/sync/profile_sync_service.cc

Issue 10335015: Treat SyncCredentialsLost as an auth error (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: git try Created 8 years, 7 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/sync/profile_sync_service.h ('k') | chrome/browser/sync/profile_sync_service_mock.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/sync/profile_sync_service.cc
diff --git a/chrome/browser/sync/profile_sync_service.cc b/chrome/browser/sync/profile_sync_service.cc
index 3e605140a87bf8b45e55ca13652eeb48fcf87be0..ee612990fe4f2fd9e7ccdc6c0a1ff9f9b27e0c02 100644
--- a/chrome/browser/sync/profile_sync_service.cc
+++ b/chrome/browser/sync/profile_sync_service.cc
@@ -158,27 +158,19 @@ ProfileSyncService::~ProfileSyncService() {
Shutdown();
}
-bool ProfileSyncService::AreCredentialsAvailable() {
- if (IsManaged()) {
- return false;
- }
-
- // If we have start suppressed, then basically just act like we have no
- // credentials (login is required to fix this, since we need the user's
- // passphrase to encrypt/decrypt anyway).
- // TODO(sync): Revisit this when we move to a server-based keystore.
- if (sync_prefs_.IsStartSuppressed())
+bool ProfileSyncService::IsSyncEnabledAndLoggedIn() {
+ // Exit if sync is disabled.
+ if (IsManaged() || sync_prefs_.IsStartSuppressed())
return false;
- // CrOS user is always logged in. Chrome uses signin_ to check logged in.
- if (signin_->GetAuthenticatedUsername().empty())
- return false;
+ // Sync is logged in if there is a non-empty authenticated username.
+ return !signin_->GetAuthenticatedUsername().empty();
+}
+bool ProfileSyncService::IsSyncTokenAvailable() {
TokenService* token_service = TokenServiceFactory::GetForProfile(profile_);
if (!token_service)
return false;
-
- // TODO(chron): Verify CrOS unit test behavior.
return token_service->HasTokenForService(GaiaConstants::kSyncService);
}
@@ -207,7 +199,15 @@ void ProfileSyncService::Initialize() {
}
void ProfileSyncService::TryStart() {
- if (!sync_prefs_.IsStartSuppressed() && AreCredentialsAvailable()) {
+ if (!IsSyncEnabledAndLoggedIn())
+ return;
+ TokenService* token_service = TokenServiceFactory::GetForProfile(profile_);
+ if (!token_service)
+ return;
+ // Don't start the backend if the token service hasn't finished loading tokens
+ // yet (if the backend is started before the sync token has been loaded,
+ // GetCredentials() will return bogus credentials).
+ if (IsSyncTokenAvailable() || token_service->TokensLoadedFromDB()) {
if (HasSyncSetupCompleted() || auto_start_enabled_) {
// If sync setup has completed we always start the backend.
// If autostart is enabled, but we haven't completed sync setup, we try to
@@ -217,15 +217,6 @@ void ProfileSyncService::TryStart() {
// be done by the wizard.
StartUp();
}
- } else if (HasSyncSetupCompleted()) {
- TokenService* token_service = TokenServiceFactory::GetForProfile(profile_);
- if (token_service && token_service->TokensLoadedFromDB() &&
- !AreCredentialsAvailable()) {
- // The token service has lost sync's tokens. We cannot recover from this
- // without signing back in, which is not yet supported. For now, we
- // trigger an unrecoverable error.
- OnUnrecoverableError(FROM_HERE, "Sync credentials lost.");
- }
}
}
@@ -312,8 +303,16 @@ SyncCredentials ProfileSyncService::GetCredentials() {
credentials.email = signin_->GetAuthenticatedUsername();
DCHECK(!credentials.email.empty());
TokenService* service = TokenServiceFactory::GetForProfile(profile_);
- credentials.sync_token = service->GetTokenForService(
- GaiaConstants::kSyncService);
+ if (service->HasTokenForService(GaiaConstants::kSyncService)) {
+ credentials.sync_token = service->GetTokenForService(
+ GaiaConstants::kSyncService);
+ UMA_HISTOGRAM_BOOLEAN("Sync.CredentialsLost", false);
+ } else {
+ // We've lost our sync credentials (crbug.com/121755), so just make up some
+ // invalid credentials so the backend will generate an auth error.
+ UMA_HISTOGRAM_BOOLEAN("Sync.CredentialsLost", true);
+ credentials.sync_token = "credentials_lost";
+ }
return credentials;
}
@@ -404,7 +403,7 @@ void ProfileSyncService::StartUp() {
return;
}
- DCHECK(AreCredentialsAvailable());
+ DCHECK(IsSyncEnabledAndLoggedIn());
last_synced_time_ = sync_prefs_.GetLastSyncedTime();
@@ -1393,7 +1392,10 @@ void ProfileSyncService::OnSyncManagedPrefChange(bool is_sync_managed) {
NotifyObservers();
if (is_sync_managed) {
DisableForUser();
- } else if (HasSyncSetupCompleted() && AreCredentialsAvailable()) {
+ } else if (HasSyncSetupCompleted() &&
+ IsSyncEnabledAndLoggedIn() &&
+ IsSyncTokenAvailable()) {
+ // Previously-configured sync has been re-enabled, so start sync now.
StartUp();
}
}
@@ -1515,8 +1517,8 @@ void ProfileSyncService::Observe(int type,
*(content::Details<const TokenService::TokenRequestFailedDetails>(
details).ptr());
if (IsTokenServiceRelevant(token_details.service()) &&
- !AreCredentialsAvailable()) {
- // The additional check around AreCredentialsAvailable above prevents us
+ !IsSyncTokenAvailable()) {
+ // The additional check around IsSyncTokenAvailable() above prevents us
// sounding the alarm if we actually have a valid token but a refresh
// attempt by TokenService failed for any variety of reasons (e.g. flaky
// network). It's possible the token we do have is also invalid, but in
@@ -1533,10 +1535,11 @@ void ProfileSyncService::Observe(int type,
*(content::Details<const TokenService::TokenAvailableDetails>(
details).ptr());
if (IsTokenServiceRelevant(token_details.service()) &&
- AreCredentialsAvailable()) {
+ IsSyncEnabledAndLoggedIn() &&
+ IsSyncTokenAvailable()) {
if (backend_initialized_)
backend_->UpdateCredentials(GetCredentials());
- else if (!sync_prefs_.IsStartSuppressed())
+ else
StartUp();
}
break;
@@ -1544,20 +1547,14 @@ void ProfileSyncService::Observe(int type,
case chrome::NOTIFICATION_TOKEN_LOADING_FINISHED: {
// This notification gets fired when TokenService loads the tokens
// from storage.
- if (AreCredentialsAvailable()) {
- // Initialize the backend if sync token was loaded.
- if (backend_initialized_) {
+ if (IsSyncEnabledAndLoggedIn()) {
+ // Initialize the backend if sync is enabled. If the sync token was
+ // not loaded, GetCredentials() will generate invalid credentials to
+ // cause the backend to generate an auth error (crbug.com/121755).
+ if (backend_initialized_)
backend_->UpdateCredentials(GetCredentials());
- }
- if (!sync_prefs_.IsStartSuppressed())
+ else
StartUp();
- } else if (!auto_start_enabled_ &&
- !signin_->GetAuthenticatedUsername().empty() &&
- HasSyncSetupCompleted()) {
- // If not in auto-start / Chrome OS mode, and we have a username
- // without tokens, the user will need to signin again. At the moment
- // this is not supported, so we trigger an unrecoverable error.
- OnUnrecoverableError(FROM_HERE, "Sync credentials lost.");
}
break;
}
« no previous file with comments | « chrome/browser/sync/profile_sync_service.h ('k') | chrome/browser/sync/profile_sync_service_mock.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698