OLD | NEW |
| (Empty) |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "chrome/browser/chromeos/login/auth_sync_observer.h" | |
6 | |
7 #include "base/metrics/user_metrics.h" | |
8 #include "base/metrics/user_metrics_action.h" | |
9 #include "base/prefs/pref_service.h" | |
10 #include "chrome/browser/chromeos/login/supervised_user_manager.h" | |
11 #include "chrome/browser/chromeos/login/user_manager.h" | |
12 #include "chrome/browser/sync/profile_sync_service.h" | |
13 #include "chrome/browser/sync/profile_sync_service_factory.h" | |
14 #include "chrome/common/pref_names.h" | |
15 #include "content/public/browser/user_metrics.h" | |
16 #include "google_apis/gaia/gaia_auth_util.h" | |
17 | |
18 class Profile; | |
19 class ProfileSyncService; | |
20 | |
21 namespace chromeos { | |
22 | |
23 AuthSyncObserver::AuthSyncObserver(Profile* profile) | |
24 : profile_(profile) { | |
25 } | |
26 | |
27 AuthSyncObserver::~AuthSyncObserver() { | |
28 } | |
29 | |
30 void AuthSyncObserver::StartObserving() { | |
31 ProfileSyncService* sync_service = | |
32 ProfileSyncServiceFactory::GetForProfile(profile_); | |
33 if (sync_service) | |
34 sync_service->AddObserver(this); | |
35 } | |
36 | |
37 void AuthSyncObserver::Shutdown() { | |
38 ProfileSyncService* sync_service = | |
39 ProfileSyncServiceFactory::GetForProfile(profile_); | |
40 if (sync_service) | |
41 sync_service->RemoveObserver(this); | |
42 } | |
43 | |
44 void AuthSyncObserver::OnStateChanged() { | |
45 DCHECK(UserManager::Get()->IsLoggedInAsRegularUser() || | |
46 UserManager::Get()->IsLoggedInAsLocallyManagedUser()); | |
47 ProfileSyncService* sync_service = | |
48 ProfileSyncServiceFactory::GetForProfile(profile_); | |
49 User* user = UserManager::Get()->GetUserByProfile(profile_); | |
50 GoogleServiceAuthError::State state = | |
51 sync_service->GetAuthError().state(); | |
52 if (state != GoogleServiceAuthError::NONE && | |
53 state != GoogleServiceAuthError::CONNECTION_FAILED && | |
54 state != GoogleServiceAuthError::SERVICE_UNAVAILABLE && | |
55 state != GoogleServiceAuthError::REQUEST_CANCELED) { | |
56 // Invalidate OAuth2 refresh token to force Gaia sign-in flow. This is | |
57 // needed because sign-out/sign-in solution is suggested to the user. | |
58 // TODO(nkostylev): Remove after crosbug.com/25978 is implemented. | |
59 LOG(WARNING) << "Invalidate OAuth token because of a sync error: " | |
60 << sync_service->GetAuthError().ToString(); | |
61 std::string email = user->email(); | |
62 DCHECK(!email.empty()); | |
63 // TODO(nkostyelv): Change observer after active user has changed. | |
64 User::OAuthTokenStatus old_status = user->oauth_token_status(); | |
65 UserManager::Get()->SaveUserOAuthStatus(email, | |
66 User::OAUTH2_TOKEN_STATUS_INVALID); | |
67 if (user->GetType() == User::USER_TYPE_LOCALLY_MANAGED && | |
68 old_status != User::OAUTH2_TOKEN_STATUS_INVALID) { | |
69 // Attempt to restore token from file. | |
70 UserManager::Get()->GetSupervisedUserManager()->LoadSupervisedUserToken( | |
71 profile_, | |
72 base::Bind(&AuthSyncObserver::OnSupervisedTokenLoaded, | |
73 base::Unretained(this))); | |
74 content::RecordAction( | |
75 base::UserMetricsAction("ManagedUsers_Chromeos_Sync_Invalidated")); | |
76 } | |
77 } else if (state == GoogleServiceAuthError::NONE) { | |
78 if (user->GetType() == User::USER_TYPE_LOCALLY_MANAGED && | |
79 user->oauth_token_status() == User::OAUTH2_TOKEN_STATUS_INVALID) { | |
80 LOG(ERROR) << | |
81 "Got an incorrectly invalidated token case, restoring token status."; | |
82 UserManager::Get()->SaveUserOAuthStatus( | |
83 user->email(), | |
84 User::OAUTH2_TOKEN_STATUS_VALID); | |
85 content::RecordAction( | |
86 base::UserMetricsAction("ManagedUsers_Chromeos_Sync_Recovered")); | |
87 } | |
88 } | |
89 } | |
90 | |
91 void AuthSyncObserver::OnSupervisedTokenLoaded(const std::string& token) { | |
92 UserManager::Get()->GetSupervisedUserManager()->ConfigureSyncWithToken( | |
93 profile_, token); | |
94 } | |
95 | |
96 } // namespace chromeos | |
OLD | NEW |