Index: chrome/browser/chromeos/login/oauth2_login_manager.cc |
diff --git a/chrome/browser/chromeos/login/oauth2_login_manager.cc b/chrome/browser/chromeos/login/oauth2_login_manager.cc |
deleted file mode 100644 |
index 3d9f8ea395163a452eb7375d6f914d67a60437fb..0000000000000000000000000000000000000000 |
--- a/chrome/browser/chromeos/login/oauth2_login_manager.cc |
+++ /dev/null |
@@ -1,403 +0,0 @@ |
-// Copyright (c) 2013 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "chrome/browser/chromeos/login/oauth2_login_manager.h" |
- |
-#include <utility> |
-#include <vector> |
- |
-#include "base/command_line.h" |
-#include "base/metrics/histogram.h" |
-#include "base/prefs/pref_service.h" |
-#include "base/strings/string_util.h" |
-#include "chrome/browser/browser_process.h" |
-#include "chrome/browser/chromeos/login/user_manager.h" |
-#include "chrome/browser/profiles/profile.h" |
-#include "chrome/browser/signin/profile_oauth2_token_service_factory.h" |
-#include "chrome/browser/signin/signin_manager_factory.h" |
-#include "chrome/common/chrome_switches.h" |
-#include "chromeos/chromeos_switches.h" |
-#include "components/signin/core/browser/profile_oauth2_token_service.h" |
-#include "components/signin/core/browser/signin_manager.h" |
-#include "google_apis/gaia/gaia_auth_util.h" |
-#include "google_apis/gaia/gaia_constants.h" |
-#include "google_apis/gaia/gaia_urls.h" |
-#include "net/url_request/url_request_context_getter.h" |
- |
-namespace chromeos { |
- |
-namespace { |
- |
-static const char kServiceScopeGetUserInfo[] = |
- "https://www.googleapis.com/auth/userinfo.email"; |
-static const int kMaxRetries = 5; |
- |
-} // namespace |
- |
-OAuth2LoginManager::OAuth2LoginManager(Profile* user_profile) |
- : user_profile_(user_profile), |
- restore_strategy_(RESTORE_FROM_COOKIE_JAR), |
- state_(SESSION_RESTORE_NOT_STARTED) { |
- GetTokenService()->AddObserver(this); |
- if (CommandLine::ForCurrentProcess()-> |
- HasSwitch(chromeos::switches::kOobeSkipPostLogin)) { |
- // For telemetry we should mark session restore completed to avoid |
- // warnings from MergeSessionThrottle. |
- SetSessionRestoreState(SESSION_RESTORE_DONE); |
- } |
-} |
- |
-OAuth2LoginManager::~OAuth2LoginManager() { |
-} |
- |
-void OAuth2LoginManager::AddObserver(OAuth2LoginManager::Observer* observer) { |
- observer_list_.AddObserver(observer); |
-} |
- |
-void OAuth2LoginManager::RemoveObserver( |
- OAuth2LoginManager::Observer* observer) { |
- observer_list_.RemoveObserver(observer); |
-} |
- |
-void OAuth2LoginManager::RestoreSession( |
- net::URLRequestContextGetter* auth_request_context, |
- SessionRestoreStrategy restore_strategy, |
- const std::string& oauth2_refresh_token, |
- const std::string& auth_code) { |
- DCHECK(user_profile_); |
- auth_request_context_ = auth_request_context; |
- restore_strategy_ = restore_strategy; |
- refresh_token_ = oauth2_refresh_token; |
- oauthlogin_access_token_ = std::string(); |
- auth_code_ = auth_code; |
- session_restore_start_ = base::Time::Now(); |
- SetSessionRestoreState(OAuth2LoginManager::SESSION_RESTORE_PREPARING); |
- ContinueSessionRestore(); |
-} |
- |
-void OAuth2LoginManager::ContinueSessionRestore() { |
- if (restore_strategy_ == RESTORE_FROM_COOKIE_JAR || |
- restore_strategy_ == RESTORE_FROM_AUTH_CODE) { |
- FetchOAuth2Tokens(); |
- return; |
- } |
- |
- // Save passed OAuth2 refresh token. |
- if (restore_strategy_ == RESTORE_FROM_PASSED_OAUTH2_REFRESH_TOKEN) { |
- DCHECK(!refresh_token_.empty()); |
- restore_strategy_ = RESTORE_FROM_SAVED_OAUTH2_REFRESH_TOKEN; |
- StoreOAuth2Token(); |
- return; |
- } |
- |
- DCHECK(restore_strategy_ == RESTORE_FROM_SAVED_OAUTH2_REFRESH_TOKEN); |
- RestoreSessionFromSavedTokens(); |
-} |
- |
-void OAuth2LoginManager::RestoreSessionFromSavedTokens() { |
- ProfileOAuth2TokenService* token_service = GetTokenService(); |
- const std::string& primary_account_id = GetPrimaryAccountId(); |
- if (token_service->RefreshTokenIsAvailable(primary_account_id)) { |
- LOG(WARNING) << "OAuth2 refresh token is already loaded."; |
- VerifySessionCookies(); |
- } else { |
- LOG(WARNING) << "Loading OAuth2 refresh token from database."; |
- |
- // Flag user with unknown token status in case there are no saved tokens |
- // and OnRefreshTokenAvailable is not called. Flagging it here would |
- // cause user to go through Gaia in next login to obtain a new refresh |
- // token. |
- UserManager::Get()->SaveUserOAuthStatus(primary_account_id, |
- User::OAUTH_TOKEN_STATUS_UNKNOWN); |
- |
- token_service->LoadCredentials(primary_account_id); |
- } |
-} |
- |
-void OAuth2LoginManager::Stop() { |
- oauth2_token_fetcher_.reset(); |
- login_verifier_.reset(); |
-} |
- |
-bool OAuth2LoginManager::ShouldBlockTabLoading() { |
- return state_ == SESSION_RESTORE_PREPARING || |
- state_ == SESSION_RESTORE_IN_PROGRESS; |
-} |
- |
-void OAuth2LoginManager::OnRefreshTokenAvailable( |
- const std::string& account_id) { |
- LOG(WARNING) << "OnRefreshTokenAvailable"; |
- |
- if (state_ == SESSION_RESTORE_NOT_STARTED) |
- return; |
- |
- // TODO(fgorski): Once ProfileOAuth2TokenService supports multi-login, make |
- // sure to restore session cookies in the context of the correct account_id. |
- |
- // Do not validate tokens for supervised users, as they don't actually have |
- // oauth2 token. |
- if (UserManager::Get()->IsLoggedInAsLocallyManagedUser()) { |
- LOG(WARNING) << "Logged in as managed user, skip token validation."; |
- return; |
- } |
- // Only restore session cookies for the primary account in the profile. |
- if (GetPrimaryAccountId() == account_id) { |
- // Token is loaded. Undo the flagging before token loading. |
- UserManager::Get()->SaveUserOAuthStatus(account_id, |
- User::OAUTH2_TOKEN_STATUS_VALID); |
- VerifySessionCookies(); |
- } |
-} |
- |
-ProfileOAuth2TokenService* OAuth2LoginManager::GetTokenService() { |
- return ProfileOAuth2TokenServiceFactory::GetForProfile(user_profile_); |
-} |
- |
-const std::string& OAuth2LoginManager::GetPrimaryAccountId() { |
- SigninManagerBase* signin_manager = |
- SigninManagerFactory::GetForProfile(user_profile_); |
- return signin_manager->GetAuthenticatedAccountId(); |
-} |
- |
-void OAuth2LoginManager::StoreOAuth2Token() { |
- const std::string& primary_account_id = GetPrimaryAccountId(); |
- if (primary_account_id.empty()) { |
- GetAccountIdOfRefreshToken(refresh_token_); |
- return; |
- } |
- |
- OnGetUserEmailResponse(primary_account_id); |
-} |
- |
-void OAuth2LoginManager::GetAccountIdOfRefreshToken( |
- const std::string& refresh_token) { |
- gaia::OAuthClientInfo client_info; |
- GaiaUrls* gaia_urls = GaiaUrls::GetInstance(); |
- client_info.client_id = gaia_urls->oauth2_chrome_client_id(); |
- client_info.client_secret = gaia_urls->oauth2_chrome_client_secret(); |
- |
- account_id_fetcher_.reset(new gaia::GaiaOAuthClient( |
- auth_request_context_.get())); |
- account_id_fetcher_->RefreshToken(client_info, refresh_token, |
- std::vector<std::string>(1, kServiceScopeGetUserInfo), kMaxRetries, |
- this); |
-} |
- |
-void OAuth2LoginManager::OnRefreshTokenResponse( |
- const std::string& access_token, |
- int expires_in_seconds) { |
- account_id_fetcher_->GetUserEmail(access_token, kMaxRetries, this); |
-} |
- |
-void OAuth2LoginManager::OnGetUserEmailResponse( |
- const std::string& user_email) { |
- DCHECK(!refresh_token_.empty()); |
- account_id_fetcher_.reset(); |
- std::string canonicalized = gaia::CanonicalizeEmail(user_email); |
- GetTokenService()->UpdateCredentials(canonicalized, refresh_token_); |
- |
- FOR_EACH_OBSERVER(Observer, observer_list_, |
- OnNewRefreshTokenAvaiable(user_profile_)); |
-} |
- |
-void OAuth2LoginManager::OnOAuthError() { |
- account_id_fetcher_.reset(); |
- LOG(ERROR) << "Account id fetch failed!"; |
- SetSessionRestoreState(OAuth2LoginManager::SESSION_RESTORE_FAILED); |
-} |
- |
-void OAuth2LoginManager::OnNetworkError(int response_code) { |
- account_id_fetcher_.reset(); |
- LOG(ERROR) << "Account id fetch failed! response_code=" << response_code; |
- SetSessionRestoreState(OAuth2LoginManager::SESSION_RESTORE_FAILED); |
-} |
- |
-void OAuth2LoginManager::FetchOAuth2Tokens() { |
- DCHECK(auth_request_context_.get()); |
- // If we have authenticated cookie jar, get OAuth1 token first, then fetch |
- // SID/LSID cookies through OAuthLogin call. |
- if (restore_strategy_ == RESTORE_FROM_COOKIE_JAR) { |
- oauth2_token_fetcher_.reset( |
- new OAuth2TokenFetcher(this, auth_request_context_.get())); |
- oauth2_token_fetcher_->StartExchangeFromCookies(std::string()); |
- } else if (restore_strategy_ == RESTORE_FROM_AUTH_CODE) { |
- DCHECK(!auth_code_.empty()); |
- oauth2_token_fetcher_.reset( |
- new OAuth2TokenFetcher(this, |
- g_browser_process->system_request_context())); |
- oauth2_token_fetcher_->StartExchangeFromAuthCode(auth_code_); |
- } else { |
- NOTREACHED(); |
- SetSessionRestoreState(OAuth2LoginManager::SESSION_RESTORE_FAILED); |
- } |
-} |
- |
-void OAuth2LoginManager::OnOAuth2TokensAvailable( |
- const GaiaAuthConsumer::ClientOAuthResult& oauth2_tokens) { |
- VLOG(1) << "OAuth2 tokens fetched"; |
- DCHECK(refresh_token_.empty()); |
- refresh_token_.assign(oauth2_tokens.refresh_token); |
- oauthlogin_access_token_ = oauth2_tokens.access_token; |
- StoreOAuth2Token(); |
-} |
- |
-void OAuth2LoginManager::OnOAuth2TokensFetchFailed() { |
- LOG(ERROR) << "OAuth2 tokens fetch failed!"; |
- RecordSessionRestoreOutcome(SESSION_RESTORE_TOKEN_FETCH_FAILED, |
- SESSION_RESTORE_FAILED); |
-} |
- |
-void OAuth2LoginManager::VerifySessionCookies() { |
- DCHECK(!login_verifier_.get()); |
- login_verifier_.reset( |
- new OAuth2LoginVerifier(this, |
- g_browser_process->system_request_context(), |
- user_profile_->GetRequestContext(), |
- oauthlogin_access_token_)); |
- |
- if (restore_strategy_ == RESTORE_FROM_SAVED_OAUTH2_REFRESH_TOKEN) { |
- login_verifier_->VerifyUserCookies(user_profile_); |
- return; |
- } |
- |
- RestoreSessionCookies(); |
-} |
- |
-void OAuth2LoginManager::RestoreSessionCookies() { |
- SetSessionRestoreState(SESSION_RESTORE_IN_PROGRESS); |
- login_verifier_->VerifyProfileTokens(user_profile_); |
-} |
- |
-void OAuth2LoginManager::Shutdown() { |
- GetTokenService()->RemoveObserver(this); |
- login_verifier_.reset(); |
- oauth2_token_fetcher_.reset(); |
-} |
- |
-void OAuth2LoginManager::OnSessionMergeSuccess() { |
- VLOG(1) << "OAuth2 refresh and/or GAIA token verification succeeded."; |
- RecordSessionRestoreOutcome(SESSION_RESTORE_SUCCESS, |
- SESSION_RESTORE_DONE); |
-} |
- |
-void OAuth2LoginManager::OnSessionMergeFailure(bool connection_error) { |
- LOG(ERROR) << "OAuth2 refresh and GAIA token verification failed!" |
- << " connection_error: " << connection_error; |
- RecordSessionRestoreOutcome(SESSION_RESTORE_MERGE_SESSION_FAILED, |
- connection_error ? |
- SESSION_RESTORE_CONNECTION_FAILED : |
- SESSION_RESTORE_FAILED); |
-} |
- |
-void OAuth2LoginManager::OnListAccountsSuccess(const std::string& data) { |
- MergeVerificationOutcome outcome = POST_MERGE_SUCCESS; |
- // Let's analyze which accounts we see logged in here: |
- std::vector<std::pair<std::string, bool> > accounts; |
- gaia::ParseListAccountsData(data, &accounts); |
- std::string user_email = gaia::CanonicalizeEmail(GetPrimaryAccountId()); |
- if (!accounts.empty()) { |
- bool found = false; |
- bool first = true; |
- for (std::vector<std::pair<std::string, bool> >::const_iterator iter = |
- accounts.begin(); |
- iter != accounts.end(); ++iter) { |
- if (gaia::CanonicalizeEmail(iter->first) == user_email) { |
- found = true; |
- break; |
- } |
- |
- first = false; |
- } |
- |
- if (!found) |
- outcome = POST_MERGE_MISSING_PRIMARY_ACCOUNT; |
- else if (!first) |
- outcome = POST_MERGE_PRIMARY_NOT_FIRST_ACCOUNT; |
- |
- } else { |
- outcome = POST_MERGE_NO_ACCOUNTS; |
- } |
- |
- bool is_pre_merge = (state_ == SESSION_RESTORE_PREPARING); |
- RecordCookiesCheckOutcome(is_pre_merge, outcome); |
- // If the primary account is missing during the initial cookie freshness |
- // check, try to restore GAIA session cookies form the OAuth2 tokens. |
- if (is_pre_merge) { |
- if (outcome != POST_MERGE_SUCCESS && |
- outcome != POST_MERGE_PRIMARY_NOT_FIRST_ACCOUNT) { |
- RestoreSessionCookies(); |
- } else { |
- // We are done with this account, it's GAIA cookies are legit. |
- RecordSessionRestoreOutcome(SESSION_RESTORE_NOT_NEEDED, |
- SESSION_RESTORE_DONE); |
- } |
- } |
-} |
- |
-void OAuth2LoginManager::OnListAccountsFailure(bool connection_error) { |
- bool is_pre_merge = (state_ == SESSION_RESTORE_PREPARING); |
- RecordCookiesCheckOutcome( |
- is_pre_merge, |
- connection_error ? POST_MERGE_CONNECTION_FAILED : |
- POST_MERGE_VERIFICATION_FAILED); |
- if (is_pre_merge) { |
- if (!connection_error) { |
- // If we failed to get account list, our cookies might be stale so we |
- // need to attempt to restore them. |
- RestoreSessionCookies(); |
- } else { |
- RecordSessionRestoreOutcome(SESSION_RESTORE_LISTACCOUNTS_FAILED, |
- SESSION_RESTORE_CONNECTION_FAILED); |
- } |
- } |
-} |
- |
-void OAuth2LoginManager::RecordSessionRestoreOutcome( |
- SessionRestoreOutcome outcome, |
- OAuth2LoginManager::SessionRestoreState state) { |
- UMA_HISTOGRAM_ENUMERATION("OAuth2Login.SessionRestore", |
- outcome, |
- SESSION_RESTORE_COUNT); |
- SetSessionRestoreState(state); |
-} |
- |
-// static |
-void OAuth2LoginManager::RecordCookiesCheckOutcome( |
- bool is_pre_merge, |
- MergeVerificationOutcome outcome) { |
- if (is_pre_merge) { |
- UMA_HISTOGRAM_ENUMERATION("OAuth2Login.PreMergeVerification", |
- outcome, |
- POST_MERGE_COUNT); |
- } else { |
- UMA_HISTOGRAM_ENUMERATION("OAuth2Login.PostMergeVerification", |
- outcome, |
- POST_MERGE_COUNT); |
- } |
-} |
- |
-void OAuth2LoginManager::SetSessionRestoreState( |
- OAuth2LoginManager::SessionRestoreState state) { |
- if (state_ == state) |
- return; |
- |
- state_ = state; |
- if (state == OAuth2LoginManager::SESSION_RESTORE_FAILED) { |
- UMA_HISTOGRAM_TIMES("OAuth2Login.SessionRestoreTimeToFailure", |
- base::Time::Now() - session_restore_start_); |
- } else if (state == OAuth2LoginManager::SESSION_RESTORE_DONE) { |
- UMA_HISTOGRAM_TIMES("OAuth2Login.SessionRestoreTimeToSuccess", |
- base::Time::Now() - session_restore_start_); |
- } |
- |
- FOR_EACH_OBSERVER(Observer, observer_list_, |
- OnSessionRestoreStateChanged(user_profile_, state_)); |
-} |
- |
-void OAuth2LoginManager::SetSessionRestoreStartForTesting( |
- const base::Time& time) { |
- session_restore_start_ = time; |
-} |
- |
-} // namespace chromeos |