Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / chromeos / login / auth_sync_observer.cc
index 4c623c2..29e5dee 100644 (file)
@@ -4,12 +4,15 @@
 
 #include "chrome/browser/chromeos/login/auth_sync_observer.h"
 
+#include "base/metrics/user_metrics.h"
+#include "base/metrics/user_metrics_action.h"
 #include "base/prefs/pref_service.h"
 #include "chrome/browser/chromeos/login/supervised_user_manager.h"
 #include "chrome/browser/chromeos/login/user_manager.h"
 #include "chrome/browser/sync/profile_sync_service.h"
 #include "chrome/browser/sync/profile_sync_service_factory.h"
 #include "chrome/common/pref_names.h"
+#include "content/public/browser/user_metrics.h"
 #include "google_apis/gaia/gaia_auth_util.h"
 
 class Profile;
@@ -43,6 +46,7 @@ void AuthSyncObserver::OnStateChanged() {
          UserManager::Get()->IsLoggedInAsLocallyManagedUser());
   ProfileSyncService* sync_service =
       ProfileSyncServiceFactory::GetForProfile(profile_);
+  User* user = UserManager::Get()->GetUserByProfile(profile_);
   GoogleServiceAuthError::State state =
       sync_service->GetAuthError().state();
   if (state != GoogleServiceAuthError::NONE &&
@@ -54,21 +58,39 @@ void AuthSyncObserver::OnStateChanged() {
     // TODO(nkostylev): Remove after crosbug.com/25978 is implemented.
     LOG(WARNING) << "Invalidate OAuth token because of a sync error: "
                  << sync_service->GetAuthError().ToString();
-    std::string email = profile_->GetProfileName();
-    if (email.empty() && UserManager::Get()->IsLoggedInAsLocallyManagedUser()) {
-      std::string sync_id =
-          profile_->GetPrefs()->GetString(prefs::kManagedUserId);
-      const User* user =
-          UserManager::Get()->GetSupervisedUserManager()->FindBySyncId(sync_id);
-      if (user)
-        email = user->email();
-    }
+    std::string email = user->email();
     DCHECK(!email.empty());
     // TODO(nkostyelv): Change observer after active user has changed.
-    UserManager::Get()->SaveUserOAuthStatus(
-        gaia::CanonicalizeEmail(email),
+    User::OAuthTokenStatus old_status = user->oauth_token_status();
+    UserManager::Get()->SaveUserOAuthStatus(email,
         User::OAUTH2_TOKEN_STATUS_INVALID);
+    if (user->GetType() == User::USER_TYPE_LOCALLY_MANAGED &&
+        old_status != User::OAUTH2_TOKEN_STATUS_INVALID) {
+       // Attempt to restore token from file.
+       UserManager::Get()->GetSupervisedUserManager()->LoadSupervisedUserToken(
+           profile_,
+           base::Bind(&AuthSyncObserver::OnSupervisedTokenLoaded,
+               base::Unretained(this)));
+       content::RecordAction(
+           base::UserMetricsAction("ManagedUsers_Chromeos_Sync_Invalidated"));
+    }
+  } else if (state == GoogleServiceAuthError::NONE) {
+    if (user->GetType() == User::USER_TYPE_LOCALLY_MANAGED &&
+        user->oauth_token_status() == User::OAUTH2_TOKEN_STATUS_INVALID) {
+      LOG(ERROR) <<
+          "Got an incorrectly invalidated token case, restoring token status.";
+      UserManager::Get()->SaveUserOAuthStatus(
+          user->email(),
+          User::OAUTH2_TOKEN_STATUS_VALID);
+       content::RecordAction(
+           base::UserMetricsAction("ManagedUsers_Chromeos_Sync_Recovered"));
+    }
   }
 }
 
+void AuthSyncObserver::OnSupervisedTokenLoaded(const std::string& token) {
+  UserManager::Get()->GetSupervisedUserManager()->ConfigureSyncWithToken(
+      profile_, token);
+}
+
 }  // namespace chromeos