| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/signin/oauth2_token_service_delegate_android.h" | 5 #include "chrome/browser/signin/oauth2_token_service_delegate_android.h" |
| 6 | 6 |
| 7 #include "base/android/context_utils.h" |
| 7 #include "base/android/jni_android.h" | 8 #include "base/android/jni_android.h" |
| 8 #include "base/android/jni_array.h" | 9 #include "base/android/jni_array.h" |
| 9 #include "base/android/jni_string.h" | 10 #include "base/android/jni_string.h" |
| 10 #include "base/bind.h" | 11 #include "base/bind.h" |
| 11 #include "base/logging.h" | 12 #include "base/logging.h" |
| 12 #include "base/macros.h" | 13 #include "base/macros.h" |
| 13 #include "base/metrics/histogram_macros.h" | 14 #include "base/metrics/histogram_macros.h" |
| 14 #include "base/stl_util.h" | 15 #include "base/stl_util.h" |
| 15 #include "chrome/browser/profiles/profile_android.h" | 16 #include "chrome/browser/profiles/profile_android.h" |
| 16 #include "chrome/browser/signin/profile_oauth2_token_service_factory.h" | 17 #include "chrome/browser/signin/profile_oauth2_token_service_factory.h" |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 87 ScopedJavaLocalRef<jstring> j_username = | 88 ScopedJavaLocalRef<jstring> j_username = |
| 88 ConvertUTF8ToJavaString(env, account_id_); | 89 ConvertUTF8ToJavaString(env, account_id_); |
| 89 ScopedJavaLocalRef<jstring> j_scope = ConvertUTF8ToJavaString(env, scope); | 90 ScopedJavaLocalRef<jstring> j_scope = ConvertUTF8ToJavaString(env, scope); |
| 90 std::unique_ptr<FetchOAuth2TokenCallback> heap_callback( | 91 std::unique_ptr<FetchOAuth2TokenCallback> heap_callback( |
| 91 new FetchOAuth2TokenCallback( | 92 new FetchOAuth2TokenCallback( |
| 92 base::Bind(&AndroidAccessTokenFetcher::OnAccessTokenResponse, | 93 base::Bind(&AndroidAccessTokenFetcher::OnAccessTokenResponse, |
| 93 weak_factory_.GetWeakPtr()))); | 94 weak_factory_.GetWeakPtr()))); |
| 94 | 95 |
| 95 // Call into Java to get a new token. | 96 // Call into Java to get a new token. |
| 96 Java_OAuth2TokenService_getOAuth2AuthToken( | 97 Java_OAuth2TokenService_getOAuth2AuthToken( |
| 97 env, j_username, j_scope, | 98 env, base::android::GetApplicationContext(), j_username, j_scope, |
| 98 reinterpret_cast<intptr_t>(heap_callback.release())); | 99 reinterpret_cast<intptr_t>(heap_callback.release())); |
| 99 } | 100 } |
| 100 | 101 |
| 101 void AndroidAccessTokenFetcher::CancelRequest() { | 102 void AndroidAccessTokenFetcher::CancelRequest() { |
| 102 request_was_cancelled_ = true; | 103 request_was_cancelled_ = true; |
| 103 } | 104 } |
| 104 | 105 |
| 105 void AndroidAccessTokenFetcher::OnAccessTokenResponse( | 106 void AndroidAccessTokenFetcher::OnAccessTokenResponse( |
| 106 const GoogleServiceAuthError& error, | 107 const GoogleServiceAuthError& error, |
| 107 const std::string& access_token, | 108 const std::string& access_token, |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 144 : error(error) {} | 145 : error(error) {} |
| 145 | 146 |
| 146 OAuth2TokenServiceDelegateAndroid::OAuth2TokenServiceDelegateAndroid( | 147 OAuth2TokenServiceDelegateAndroid::OAuth2TokenServiceDelegateAndroid( |
| 147 AccountTrackerService* account_tracker_service) | 148 AccountTrackerService* account_tracker_service) |
| 148 : account_tracker_service_(account_tracker_service), | 149 : account_tracker_service_(account_tracker_service), |
| 149 fire_refresh_token_loaded_(RT_LOAD_NOT_START) { | 150 fire_refresh_token_loaded_(RT_LOAD_NOT_START) { |
| 150 DVLOG(1) << "OAuth2TokenServiceDelegateAndroid::ctor"; | 151 DVLOG(1) << "OAuth2TokenServiceDelegateAndroid::ctor"; |
| 151 DCHECK(account_tracker_service_); | 152 DCHECK(account_tracker_service_); |
| 152 JNIEnv* env = AttachCurrentThread(); | 153 JNIEnv* env = AttachCurrentThread(); |
| 153 base::android::ScopedJavaLocalRef<jobject> local_java_ref = | 154 base::android::ScopedJavaLocalRef<jobject> local_java_ref = |
| 154 Java_OAuth2TokenService_create(env, reinterpret_cast<intptr_t>(this)); | 155 Java_OAuth2TokenService_create(env, |
| 156 base::android::GetApplicationContext(), |
| 157 reinterpret_cast<intptr_t>(this)); |
| 155 java_ref_.Reset(env, local_java_ref.obj()); | 158 java_ref_.Reset(env, local_java_ref.obj()); |
| 156 | 159 |
| 157 if (account_tracker_service_->GetMigrationState() == | 160 if (account_tracker_service_->GetMigrationState() == |
| 158 AccountTrackerService::MIGRATION_IN_PROGRESS) { | 161 AccountTrackerService::MIGRATION_IN_PROGRESS) { |
| 159 std::vector<std::string> accounts = GetAccounts(); | 162 std::vector<std::string> accounts = GetAccounts(); |
| 160 std::vector<std::string> accounts_id; | 163 std::vector<std::string> accounts_id; |
| 161 for (auto account_name : accounts) { | 164 for (auto account_name : accounts) { |
| 162 AccountInfo account_info = | 165 AccountInfo account_info = |
| 163 account_tracker_service_->FindAccountInfoByEmail(account_name); | 166 account_tracker_service_->FindAccountInfoByEmail(account_name); |
| 164 DCHECK(!account_info.gaia.empty()); | 167 DCHECK(!account_info.gaia.empty()); |
| 165 accounts_id.push_back(account_info.gaia); | 168 accounts_id.push_back(account_info.gaia); |
| 166 } | 169 } |
| 167 ScopedJavaLocalRef<jobjectArray> java_accounts( | 170 ScopedJavaLocalRef<jobjectArray> java_accounts( |
| 168 base::android::ToJavaArrayOfStrings(env, accounts_id)); | 171 base::android::ToJavaArrayOfStrings(env, accounts_id)); |
| 169 Java_OAuth2TokenService_saveStoredAccounts(env, java_accounts); | 172 Java_OAuth2TokenService_saveStoredAccounts( |
| 173 env, base::android::GetApplicationContext(), java_accounts); |
| 170 } | 174 } |
| 171 | 175 |
| 172 if (!is_testing_profile_) { | 176 if (!is_testing_profile_) { |
| 173 Java_OAuth2TokenService_validateAccounts(AttachCurrentThread(), java_ref_, | 177 Java_OAuth2TokenService_validateAccounts( |
| 174 JNI_TRUE); | 178 AttachCurrentThread(), java_ref_, |
| 179 base::android::GetApplicationContext(), JNI_TRUE); |
| 175 } | 180 } |
| 176 } | 181 } |
| 177 | 182 |
| 178 OAuth2TokenServiceDelegateAndroid::~OAuth2TokenServiceDelegateAndroid() { | 183 OAuth2TokenServiceDelegateAndroid::~OAuth2TokenServiceDelegateAndroid() { |
| 179 } | 184 } |
| 180 | 185 |
| 181 // static | 186 // static |
| 182 ScopedJavaLocalRef<jobject> OAuth2TokenServiceDelegateAndroid::GetForProfile( | 187 ScopedJavaLocalRef<jobject> OAuth2TokenServiceDelegateAndroid::GetForProfile( |
| 183 JNIEnv* env, | 188 JNIEnv* env, |
| 184 jclass clazz, | 189 jclass clazz, |
| (...skipping 16 matching lines...) Expand all Loading... |
| 201 | 206 |
| 202 bool OAuth2TokenServiceDelegateAndroid::RefreshTokenIsAvailable( | 207 bool OAuth2TokenServiceDelegateAndroid::RefreshTokenIsAvailable( |
| 203 const std::string& account_id) const { | 208 const std::string& account_id) const { |
| 204 DVLOG(1) << "OAuth2TokenServiceDelegateAndroid::RefreshTokenIsAvailable" | 209 DVLOG(1) << "OAuth2TokenServiceDelegateAndroid::RefreshTokenIsAvailable" |
| 205 << " account= " << account_id; | 210 << " account= " << account_id; |
| 206 std::string account_name = MapAccountIdToAccountName(account_id); | 211 std::string account_name = MapAccountIdToAccountName(account_id); |
| 207 JNIEnv* env = AttachCurrentThread(); | 212 JNIEnv* env = AttachCurrentThread(); |
| 208 ScopedJavaLocalRef<jstring> j_account_id = | 213 ScopedJavaLocalRef<jstring> j_account_id = |
| 209 ConvertUTF8ToJavaString(env, account_name); | 214 ConvertUTF8ToJavaString(env, account_name); |
| 210 jboolean refresh_token_is_available = | 215 jboolean refresh_token_is_available = |
| 211 Java_OAuth2TokenService_hasOAuth2RefreshToken(env, j_account_id); | 216 Java_OAuth2TokenService_hasOAuth2RefreshToken( |
| 217 env, base::android::GetApplicationContext(), j_account_id); |
| 212 return refresh_token_is_available == JNI_TRUE; | 218 return refresh_token_is_available == JNI_TRUE; |
| 213 } | 219 } |
| 214 | 220 |
| 215 bool OAuth2TokenServiceDelegateAndroid::RefreshTokenHasError( | 221 bool OAuth2TokenServiceDelegateAndroid::RefreshTokenHasError( |
| 216 const std::string& account_id) const { | 222 const std::string& account_id) const { |
| 217 auto it = errors_.find(account_id); | 223 auto it = errors_.find(account_id); |
| 218 // TODO(rogerta): should we distinguish between transient and persistent? | 224 // TODO(rogerta): should we distinguish between transient and persistent? |
| 219 return it == errors_.end() ? false : IsError(it->second.error); | 225 return it == errors_.end() ? false : IsError(it->second.error); |
| 220 } | 226 } |
| 221 | 227 |
| 222 void OAuth2TokenServiceDelegateAndroid::UpdateAuthError( | 228 void OAuth2TokenServiceDelegateAndroid::UpdateAuthError( |
| 223 const std::string& account_id, | 229 const std::string& account_id, |
| 224 const GoogleServiceAuthError& error) { | 230 const GoogleServiceAuthError& error) { |
| 225 DVLOG(1) << "OAuth2TokenServiceDelegateAndroid::UpdateAuthError" | 231 DVLOG(1) << "OAuth2TokenServiceDelegateAndroid::UpdateAuthError" |
| 226 << " account=" << account_id | 232 << " account=" << account_id |
| 227 << " error=" << error.ToString(); | 233 << " error=" << error.ToString(); |
| 228 if (error.state() == GoogleServiceAuthError::NONE) { | 234 if (error.state() == GoogleServiceAuthError::NONE) { |
| 229 errors_.erase(account_id); | 235 errors_.erase(account_id); |
| 230 } else { | 236 } else { |
| 231 // TODO(rogerta): should we distinguish between transient and persistent? | 237 // TODO(rogerta): should we distinguish between transient and persistent? |
| 232 errors_[account_id] = ErrorInfo(error); | 238 errors_[account_id] = ErrorInfo(error); |
| 233 } | 239 } |
| 234 } | 240 } |
| 235 | 241 |
| 236 std::vector<std::string> OAuth2TokenServiceDelegateAndroid::GetAccounts() { | 242 std::vector<std::string> OAuth2TokenServiceDelegateAndroid::GetAccounts() { |
| 237 std::vector<std::string> accounts; | 243 std::vector<std::string> accounts; |
| 238 JNIEnv* env = AttachCurrentThread(); | 244 JNIEnv* env = AttachCurrentThread(); |
| 239 ScopedJavaLocalRef<jobjectArray> j_accounts = | 245 ScopedJavaLocalRef<jobjectArray> j_accounts = |
| 240 Java_OAuth2TokenService_getAccounts(env); | 246 Java_OAuth2TokenService_getAccounts( |
| 247 env, base::android::GetApplicationContext()); |
| 241 // TODO(fgorski): We may decide to filter out some of the accounts. | 248 // TODO(fgorski): We may decide to filter out some of the accounts. |
| 242 base::android::AppendJavaStringArrayToStringVector(env, j_accounts.obj(), | 249 base::android::AppendJavaStringArrayToStringVector(env, j_accounts.obj(), |
| 243 &accounts); | 250 &accounts); |
| 244 return accounts; | 251 return accounts; |
| 245 } | 252 } |
| 246 | 253 |
| 247 std::vector<std::string> | 254 std::vector<std::string> |
| 248 OAuth2TokenServiceDelegateAndroid::GetSystemAccountNames() { | 255 OAuth2TokenServiceDelegateAndroid::GetSystemAccountNames() { |
| 249 std::vector<std::string> account_names; | 256 std::vector<std::string> account_names; |
| 250 JNIEnv* env = AttachCurrentThread(); | 257 JNIEnv* env = AttachCurrentThread(); |
| 251 ScopedJavaLocalRef<jobjectArray> j_accounts = | 258 ScopedJavaLocalRef<jobjectArray> j_accounts = |
| 252 Java_OAuth2TokenService_getSystemAccountNames(env); | 259 Java_OAuth2TokenService_getSystemAccountNames( |
| 260 env, base::android::GetApplicationContext()); |
| 253 base::android::AppendJavaStringArrayToStringVector(env, j_accounts.obj(), | 261 base::android::AppendJavaStringArrayToStringVector(env, j_accounts.obj(), |
| 254 &account_names); | 262 &account_names); |
| 255 return account_names; | 263 return account_names; |
| 256 } | 264 } |
| 257 | 265 |
| 258 OAuth2AccessTokenFetcher* | 266 OAuth2AccessTokenFetcher* |
| 259 OAuth2TokenServiceDelegateAndroid::CreateAccessTokenFetcher( | 267 OAuth2TokenServiceDelegateAndroid::CreateAccessTokenFetcher( |
| 260 const std::string& account_id, | 268 const std::string& account_id, |
| 261 net::URLRequestContextGetter* getter, | 269 net::URLRequestContextGetter* getter, |
| 262 OAuth2AccessTokenConsumer* consumer) { | 270 OAuth2AccessTokenConsumer* consumer) { |
| 263 DVLOG(1) << "OAuth2TokenServiceDelegateAndroid::CreateAccessTokenFetcher" | 271 DVLOG(1) << "OAuth2TokenServiceDelegateAndroid::CreateAccessTokenFetcher" |
| 264 << " account= " << account_id; | 272 << " account= " << account_id; |
| 265 ValidateAccountId(account_id); | 273 ValidateAccountId(account_id); |
| 266 return new AndroidAccessTokenFetcher(consumer, | 274 return new AndroidAccessTokenFetcher(consumer, |
| 267 MapAccountIdToAccountName(account_id)); | 275 MapAccountIdToAccountName(account_id)); |
| 268 } | 276 } |
| 269 | 277 |
| 270 void OAuth2TokenServiceDelegateAndroid::InvalidateAccessToken( | 278 void OAuth2TokenServiceDelegateAndroid::InvalidateAccessToken( |
| 271 const std::string& account_id, | 279 const std::string& account_id, |
| 272 const std::string& client_id, | 280 const std::string& client_id, |
| 273 const OAuth2TokenService::ScopeSet& scopes, | 281 const OAuth2TokenService::ScopeSet& scopes, |
| 274 const std::string& access_token) { | 282 const std::string& access_token) { |
| 275 ValidateAccountId(account_id); | 283 ValidateAccountId(account_id); |
| 276 JNIEnv* env = AttachCurrentThread(); | 284 JNIEnv* env = AttachCurrentThread(); |
| 277 ScopedJavaLocalRef<jstring> j_access_token = | 285 ScopedJavaLocalRef<jstring> j_access_token = |
| 278 ConvertUTF8ToJavaString(env, access_token); | 286 ConvertUTF8ToJavaString(env, access_token); |
| 279 Java_OAuth2TokenService_invalidateOAuth2AuthToken(env, j_access_token); | 287 Java_OAuth2TokenService_invalidateOAuth2AuthToken( |
| 288 env, base::android::GetApplicationContext(), j_access_token); |
| 280 } | 289 } |
| 281 | 290 |
| 282 void OAuth2TokenServiceDelegateAndroid::ValidateAccounts( | 291 void OAuth2TokenServiceDelegateAndroid::ValidateAccounts( |
| 283 JNIEnv* env, | 292 JNIEnv* env, |
| 284 const JavaParamRef<jobject>& obj, | 293 const JavaParamRef<jobject>& obj, |
| 285 const JavaParamRef<jstring>& j_current_acc, | 294 const JavaParamRef<jstring>& j_current_acc, |
| 286 jboolean j_force_notifications) { | 295 jboolean j_force_notifications) { |
| 287 std::string signed_in_account_name; | 296 std::string signed_in_account_name; |
| 288 DVLOG(1) << "OAuth2TokenServiceDelegateAndroid::ValidateAccounts from java"; | 297 DVLOG(1) << "OAuth2TokenServiceDelegateAndroid::ValidateAccounts from java"; |
| 289 if (j_current_acc) | 298 if (j_current_acc) |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 330 ScopedJavaLocalRef<jobjectArray> java_accounts; | 339 ScopedJavaLocalRef<jobjectArray> java_accounts; |
| 331 if (currently_signed_in) { | 340 if (currently_signed_in) { |
| 332 java_accounts = base::android::ToJavaArrayOfStrings(env, curr_ids); | 341 java_accounts = base::android::ToJavaArrayOfStrings(env, curr_ids); |
| 333 } else { | 342 } else { |
| 334 java_accounts = | 343 java_accounts = |
| 335 base::android::ToJavaArrayOfStrings(env, std::vector<std::string>()); | 344 base::android::ToJavaArrayOfStrings(env, std::vector<std::string>()); |
| 336 } | 345 } |
| 337 | 346 |
| 338 // Save the current accounts in the token service before calling | 347 // Save the current accounts in the token service before calling |
| 339 // FireRefreshToken* methods. | 348 // FireRefreshToken* methods. |
| 340 Java_OAuth2TokenService_saveStoredAccounts(env, java_accounts); | 349 Java_OAuth2TokenService_saveStoredAccounts( |
| 350 env, base::android::GetApplicationContext(), java_accounts); |
| 341 | 351 |
| 342 for (const std::string& refreshed_id : refreshed_ids) | 352 for (const std::string& refreshed_id : refreshed_ids) |
| 343 FireRefreshTokenAvailable(refreshed_id); | 353 FireRefreshTokenAvailable(refreshed_id); |
| 344 for (const std::string& revoked_id : revoked_ids) | 354 for (const std::string& revoked_id : revoked_ids) |
| 345 FireRefreshTokenRevoked(revoked_id); | 355 FireRefreshTokenRevoked(revoked_id); |
| 346 if (fire_refresh_token_loaded_ == RT_WAIT_FOR_VALIDATION) { | 356 if (fire_refresh_token_loaded_ == RT_WAIT_FOR_VALIDATION) { |
| 347 fire_refresh_token_loaded_ = RT_LOADED; | 357 fire_refresh_token_loaded_ = RT_LOADED; |
| 348 FireRefreshTokensLoaded(); | 358 FireRefreshTokensLoaded(); |
| 349 } else if (fire_refresh_token_loaded_ == RT_LOAD_NOT_START) { | 359 } else if (fire_refresh_token_loaded_ == RT_LOAD_NOT_START) { |
| 350 fire_refresh_token_loaded_ = RT_HAS_BEEN_VALIDATED; | 360 fire_refresh_token_loaded_ = RT_HAS_BEEN_VALIDATED; |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 495 void OAuth2TokenServiceDelegateAndroid::RevokeAllCredentials() { | 505 void OAuth2TokenServiceDelegateAndroid::RevokeAllCredentials() { |
| 496 DVLOG(1) << "OAuth2TokenServiceDelegateAndroid::RevokeAllCredentials"; | 506 DVLOG(1) << "OAuth2TokenServiceDelegateAndroid::RevokeAllCredentials"; |
| 497 ScopedBatchChange batch(this); | 507 ScopedBatchChange batch(this); |
| 498 std::vector<std::string> accounts_to_revoke = GetAccounts(); | 508 std::vector<std::string> accounts_to_revoke = GetAccounts(); |
| 499 | 509 |
| 500 // Clear accounts in the token service before calling | 510 // Clear accounts in the token service before calling |
| 501 // |FireRefreshTokenRevoked|. | 511 // |FireRefreshTokenRevoked|. |
| 502 JNIEnv* env = AttachCurrentThread(); | 512 JNIEnv* env = AttachCurrentThread(); |
| 503 ScopedJavaLocalRef<jobjectArray> java_accounts( | 513 ScopedJavaLocalRef<jobjectArray> java_accounts( |
| 504 base::android::ToJavaArrayOfStrings(env, std::vector<std::string>())); | 514 base::android::ToJavaArrayOfStrings(env, std::vector<std::string>())); |
| 505 Java_OAuth2TokenService_saveStoredAccounts(env, java_accounts); | 515 Java_OAuth2TokenService_saveStoredAccounts( |
| 516 env, base::android::GetApplicationContext(), java_accounts); |
| 506 | 517 |
| 507 for (const std::string& account : accounts_to_revoke) | 518 for (const std::string& account : accounts_to_revoke) |
| 508 FireRefreshTokenRevoked(account); | 519 FireRefreshTokenRevoked(account); |
| 509 } | 520 } |
| 510 | 521 |
| 511 void OAuth2TokenServiceDelegateAndroid::LoadCredentials( | 522 void OAuth2TokenServiceDelegateAndroid::LoadCredentials( |
| 512 const std::string& primary_account_id) { | 523 const std::string& primary_account_id) { |
| 513 if (primary_account_id.empty()) { | 524 if (primary_account_id.empty()) { |
| 514 FireRefreshTokensLoaded(); | 525 FireRefreshTokensLoaded(); |
| 515 return; | 526 return; |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 556 : isTransientError | 567 : isTransientError |
| 557 ? GoogleServiceAuthError::CONNECTION_FAILED | 568 ? GoogleServiceAuthError::CONNECTION_FAILED |
| 558 : GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS); | 569 : GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS); |
| 559 heap_callback->Run(err, token, base::Time()); | 570 heap_callback->Run(err, token, base::Time()); |
| 560 } | 571 } |
| 561 | 572 |
| 562 // static | 573 // static |
| 563 bool OAuth2TokenServiceDelegateAndroid::Register(JNIEnv* env) { | 574 bool OAuth2TokenServiceDelegateAndroid::Register(JNIEnv* env) { |
| 564 return RegisterNativesImpl(env); | 575 return RegisterNativesImpl(env); |
| 565 } | 576 } |
| OLD | NEW |