Chromium Code Reviews| Index: components/signin/core/browser/account_tracker_service.cc |
| diff --git a/components/signin/core/browser/account_tracker_service.cc b/components/signin/core/browser/account_tracker_service.cc |
| index ec24462d4e8090dbceb4aae3ce281b11efa31d5c..d29adf185053d8ff7d2485f80cd72cb7b8ec7b7d 100644 |
| --- a/components/signin/core/browser/account_tracker_service.cc |
| +++ b/components/signin/core/browser/account_tracker_service.cc |
| @@ -10,6 +10,7 @@ |
| #include "base/metrics/field_trial.h" |
| #include "base/prefs/scoped_user_pref_update.h" |
| #include "base/profiler/scoped_tracker.h" |
| +#include "base/strings/string_split.h" |
| #include "base/strings/utf_string_conversions.h" |
| #include "base/trace_event/trace_event.h" |
| #include "components/signin/core/browser/refresh_token_annotation_request.h" |
| @@ -17,6 +18,8 @@ |
| #include "components/signin/core/browser/signin_manager.h" |
| #include "components/signin/core/common/signin_pref_names.h" |
| #include "components/signin/core/common/signin_switches.h" |
| +#include "google_apis/gaia/gaia_auth_consumer.h" |
| +#include "google_apis/gaia/gaia_auth_fetcher.h" |
| #include "google_apis/gaia/gaia_auth_util.h" |
| #include "google_apis/gaia/gaia_constants.h" |
| #include "google_apis/gaia/gaia_oauth_client.h" |
| @@ -31,6 +34,7 @@ const char kAccountHostedDomainPath[] = "hd"; |
| const char kAccountFullNamePath[] = "full_name"; |
| const char kAccountGivenNamePath[] = "given_name"; |
| const char kAccountLocalePath[] = "locale"; |
| +const char kAccountServiceFlagsPath[] = "service_flags"; |
| const base::TimeDelta kRefreshFromTokenServiceDelay = |
| base::TimeDelta::FromHours(24); |
| @@ -50,7 +54,8 @@ bool IsRefreshTokenDeviceIdExperimentEnabled() { |
| const char AccountTrackerService::kNoHostedDomainFound[] = "NO_HOSTED_DOMAIN"; |
| class AccountInfoFetcher : public OAuth2TokenService::Consumer, |
| - public gaia::GaiaOAuthClient::Delegate { |
| + public gaia::GaiaOAuthClient::Delegate, |
| + public GaiaAuthConsumer { |
| public: |
| AccountInfoFetcher(OAuth2TokenService* token_service, |
| net::URLRequestContextGetter* request_context_getter, |
| @@ -61,6 +66,7 @@ class AccountInfoFetcher : public OAuth2TokenService::Consumer, |
| const std::string& account_id() { return account_id_; } |
| void Start(); |
| + void SendSuccessIfDoneFetching(); |
| // OAuth2TokenService::Consumer implementation. |
| void OnGetTokenSuccess(const OAuth2TokenService::Request* request, |
| @@ -75,6 +81,12 @@ class AccountInfoFetcher : public OAuth2TokenService::Consumer, |
| void OnOAuthError() override; |
| void OnNetworkError(int response_code) override; |
| + // Overridden from GaiaAuthConsumer: |
| + void OnClientLoginSuccess(const ClientLoginResult& result) override; |
| + void OnClientLoginFailure(const GoogleServiceAuthError& error) override; |
| + void OnGetUserInfoSuccess(const UserInfoMap& data) override; |
| + void OnGetUserInfoFailure(const GoogleServiceAuthError& error) override; |
| + |
| private: |
| OAuth2TokenService* token_service_; |
| net::URLRequestContextGetter* request_context_getter_; |
| @@ -83,6 +95,10 @@ class AccountInfoFetcher : public OAuth2TokenService::Consumer, |
| scoped_ptr<OAuth2TokenService::Request> login_token_request_; |
| scoped_ptr<gaia::GaiaOAuthClient> gaia_oauth_client_; |
| + scoped_ptr<GaiaAuthFetcher> gaia_auth_fetcher_; |
| + |
| + scoped_ptr<base::DictionaryValue> fetched_user_info_; |
| + scoped_ptr<std::vector<std::string> > fetched_service_flags_; |
| }; |
| AccountInfoFetcher::AccountInfoFetcher( |
| @@ -108,10 +124,18 @@ void AccountInfoFetcher::Start() { |
| OAuth2TokenService::ScopeSet scopes; |
| scopes.insert(GaiaConstants::kGoogleUserInfoEmail); |
| scopes.insert(GaiaConstants::kGoogleUserInfoProfile); |
| + scopes.insert(GaiaConstants::kOAuth1LoginScope); |
| login_token_request_ = token_service_->StartRequest( |
| account_id_, scopes, this); |
| } |
| +void AccountInfoFetcher::SendSuccessIfDoneFetching() { |
| + if (fetched_user_info_ && fetched_service_flags_) { |
| + service_->OnUserInfoFetchSuccess( |
| + this, fetched_user_info_.get(), fetched_service_flags_.get()); |
| + } |
| +} |
| + |
| void AccountInfoFetcher::OnGetTokenSuccess( |
| const OAuth2TokenService::Request* request, |
| const std::string& access_token, |
| @@ -121,9 +145,14 @@ void AccountInfoFetcher::OnGetTokenSuccess( |
| DCHECK_EQ(request, login_token_request_.get()); |
| gaia_oauth_client_.reset(new gaia::GaiaOAuthClient(request_context_getter_)); |
| - |
| const int kMaxRetries = 3; |
| gaia_oauth_client_->GetUserInfo(access_token, kMaxRetries, this); |
| + |
| + gaia_auth_fetcher_.reset( |
| + new GaiaAuthFetcher( |
| + this, GaiaConstants::kChromeSource, request_context_getter_)); |
| + gaia_auth_fetcher_->StartOAuthLogin( |
| + access_token, GaiaConstants::kGaiaService); |
| } |
| void AccountInfoFetcher::OnGetTokenFailure( |
| @@ -148,7 +177,36 @@ void AccountInfoFetcher::OnGetUserInfoResponse( |
| "OnGetUserInfoResponse", |
| "account_id", |
| account_id_); |
| - service_->OnUserInfoFetchSuccess(this, user_info.get()); |
| + fetched_user_info_ = user_info.Pass(); |
| + SendSuccessIfDoneFetching(); |
| +} |
| + |
| +void AccountInfoFetcher::OnClientLoginSuccess( |
| + const ClientLoginResult& result) { |
| + gaia_auth_fetcher_->StartGetUserInfo(result.lsid); |
| +} |
| + |
| +void AccountInfoFetcher::OnClientLoginFailure( |
| + const GoogleServiceAuthError& error) { |
| + service_->OnUserInfoFetchFailure(this); |
| +} |
| + |
| +void AccountInfoFetcher::OnGetUserInfoSuccess(const UserInfoMap& data) { |
| + fetched_service_flags_.reset(new std::vector<std::string>); |
| + UserInfoMap::const_iterator services_iter = data.find("allServices"); |
| + if (services_iter != data.end()) { |
| + base::SplitString(services_iter->second, ',', fetched_service_flags_.get()); |
| + SendSuccessIfDoneFetching(); |
| + } else { |
| + DLOG(WARNING) << "AccountInfoFetcher::OnGetUserInfoSuccess: " |
| + << "GetUserInfo response didn't include allServices field."; |
| + service_->OnUserInfoFetchFailure(this); |
| + } |
| +} |
| + |
| +void AccountInfoFetcher::OnGetUserInfoFailure( |
| + const GoogleServiceAuthError& error) { |
| + service_->OnUserInfoFetchFailure(this); |
| } |
| void AccountInfoFetcher::OnOAuthError() { |
| @@ -440,7 +498,8 @@ void AccountTrackerService::StartFetchingUserInfo( |
| void AccountTrackerService::SetAccountStateFromUserInfo( |
| const std::string& account_id, |
| - const base::DictionaryValue* user_info) { |
| + const base::DictionaryValue* user_info, |
| + const std::vector<std::string>* service_flags) { |
| AccountState& state = accounts_[account_id]; |
| std::string gaia_id; |
| @@ -461,6 +520,8 @@ void AccountTrackerService::SetAccountStateFromUserInfo( |
| user_info->GetString("given_name", &state.info.given_name); |
| user_info->GetString("locale", &state.info.locale); |
| + state.info.service_flags = *service_flags; |
| + |
| NotifyAccountUpdated(state); |
| SaveToPrefs(state); |
| } |
| @@ -468,11 +529,12 @@ void AccountTrackerService::SetAccountStateFromUserInfo( |
| void AccountTrackerService::OnUserInfoFetchSuccess( |
| AccountInfoFetcher* fetcher, |
| - const base::DictionaryValue* user_info) { |
| + const base::DictionaryValue* user_info, |
| + const std::vector<std::string>* service_flags) { |
| const std::string& account_id = fetcher->account_id(); |
| DCHECK(ContainsKey(accounts_, account_id)); |
| - SetAccountStateFromUserInfo(account_id, user_info); |
| + SetAccountStateFromUserInfo(account_id, user_info, service_flags); |
| DeleteFetcher(fetcher); |
| } |
| @@ -516,6 +578,18 @@ void AccountTrackerService::LoadFromPrefs() { |
| state.info.given_name = base::UTF16ToUTF8(value); |
| if (dict->GetString(kAccountLocalePath, &value)) |
| state.info.locale = base::UTF16ToUTF8(value); |
| + |
| + const base::ListValue* service_flags_list; |
| + if (dict->GetList(kAccountServiceFlagsPath, &service_flags_list)) { |
| + std::string flag; |
|
brucedawson
2015/05/18 23:43:13
This variable is never used. It should be deleted
|
| + for(base::Value* flag: *service_flags_list) { |
|
brucedawson
2015/05/18 23:43:13
The Google C++ style guide recommends "for (base::
|
| + std::string flag_string; |
| + if(flag->GetAsString(&flag_string)) { |
| + state.info.service_flags.push_back(flag_string); |
| + } |
| + } |
| + } |
| + |
| if (state.info.IsValid()) |
| NotifyAccountUpdated(state); |
| } |
| @@ -552,6 +626,12 @@ void AccountTrackerService::SaveToPrefs(const AccountState& state) { |
| dict->SetString(kAccountFullNamePath, state.info.full_name); |
| dict->SetString(kAccountGivenNamePath, state.info.given_name); |
| dict->SetString(kAccountLocalePath, state.info.locale); |
| + |
| + scoped_ptr<base::ListValue> service_flags_list; |
| + service_flags_list.reset(new base::ListValue); |
| + service_flags_list->AppendStrings(state.info.service_flags); |
| + |
| + dict->Set(kAccountServiceFlagsPath, service_flags_list.Pass()); |
| } |
| void AccountTrackerService::RemoveFromPrefs(const AccountState& state) { |