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 |