OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/common/net/gaia/gaia_auth_fetcher.h" | 5 #include "chrome/common/net/gaia/gaia_auth_fetcher.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 #include <utility> | 8 #include <utility> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
298 const std::string& password, | 298 const std::string& password, |
299 const char* const service, | 299 const char* const service, |
300 const std::string& login_token, | 300 const std::string& login_token, |
301 const std::string& login_captcha, | 301 const std::string& login_captcha, |
302 HostedAccountsSetting allow_hosted_accounts) { | 302 HostedAccountsSetting allow_hosted_accounts) { |
303 | 303 |
304 DCHECK(!fetch_pending_) << "Tried to fetch two things at once!"; | 304 DCHECK(!fetch_pending_) << "Tried to fetch two things at once!"; |
305 | 305 |
306 // This class is thread agnostic, so be sure to call this only on the | 306 // This class is thread agnostic, so be sure to call this only on the |
307 // same thread each time. | 307 // same thread each time. |
308 VLOG(1) << "Starting new ClientLogin fetch for:" << username; | 308 DVLOG(1) << "Starting new ClientLogin fetch for:" << username; |
309 | 309 |
310 // Must outlive fetcher_. | 310 // Must outlive fetcher_. |
311 request_body_ = MakeClientLoginBody(username, | 311 request_body_ = MakeClientLoginBody(username, |
312 password, | 312 password, |
313 source_, | 313 source_, |
314 service, | 314 service, |
315 login_token, | 315 login_token, |
316 login_captcha, | 316 login_captcha, |
317 allow_hosted_accounts); | 317 allow_hosted_accounts); |
318 fetcher_.reset(CreateGaiaFetcher(getter_, | 318 fetcher_.reset(CreateGaiaFetcher(getter_, |
319 request_body_, | 319 request_body_, |
320 client_login_gurl_, | 320 client_login_gurl_, |
321 false, | 321 false, |
322 this)); | 322 this)); |
323 fetch_pending_ = true; | 323 fetch_pending_ = true; |
324 fetcher_->Start(); | 324 fetcher_->Start(); |
325 } | 325 } |
326 | 326 |
327 void GaiaAuthFetcher::StartIssueAuthToken(const std::string& sid, | 327 void GaiaAuthFetcher::StartIssueAuthToken(const std::string& sid, |
328 const std::string& lsid, | 328 const std::string& lsid, |
329 const char* const service) { | 329 const char* const service) { |
330 DCHECK(!fetch_pending_) << "Tried to fetch two things at once!"; | 330 DCHECK(!fetch_pending_) << "Tried to fetch two things at once!"; |
331 | 331 |
332 VLOG(1) << "Starting IssueAuthToken for: " << service; | 332 DVLOG(1) << "Starting IssueAuthToken for: " << service; |
333 requested_service_ = service; | 333 requested_service_ = service; |
334 request_body_ = MakeIssueAuthTokenBody(sid, lsid, service); | 334 request_body_ = MakeIssueAuthTokenBody(sid, lsid, service); |
335 fetcher_.reset(CreateGaiaFetcher(getter_, | 335 fetcher_.reset(CreateGaiaFetcher(getter_, |
336 request_body_, | 336 request_body_, |
337 issue_auth_token_gurl_, | 337 issue_auth_token_gurl_, |
338 false, | 338 false, |
339 this)); | 339 this)); |
340 fetch_pending_ = true; | 340 fetch_pending_ = true; |
341 fetcher_->Start(); | 341 fetcher_->Start(); |
342 } | 342 } |
343 | 343 |
344 void GaiaAuthFetcher::StartGetUserInfo(const std::string& lsid, | 344 void GaiaAuthFetcher::StartGetUserInfo(const std::string& lsid, |
345 const std::string& info_key) { | 345 const std::string& info_key) { |
346 DCHECK(!fetch_pending_) << "Tried to fetch two things at once!"; | 346 DCHECK(!fetch_pending_) << "Tried to fetch two things at once!"; |
347 | 347 |
348 VLOG(1) << "Starting GetUserInfo for lsid=" << lsid; | 348 DVLOG(1) << "Starting GetUserInfo for lsid=" << lsid; |
349 request_body_ = MakeGetUserInfoBody(lsid); | 349 request_body_ = MakeGetUserInfoBody(lsid); |
350 fetcher_.reset(CreateGaiaFetcher(getter_, | 350 fetcher_.reset(CreateGaiaFetcher(getter_, |
351 request_body_, | 351 request_body_, |
352 get_user_info_gurl_, | 352 get_user_info_gurl_, |
353 false, | 353 false, |
354 this)); | 354 this)); |
355 fetch_pending_ = true; | 355 fetch_pending_ = true; |
356 requested_info_key_ = info_key; | 356 requested_info_key_ = info_key; |
357 fetcher_->Start(); | 357 fetcher_->Start(); |
358 } | 358 } |
359 | 359 |
360 void GaiaAuthFetcher::StartTokenAuth(const std::string& auth_token) { | 360 void GaiaAuthFetcher::StartTokenAuth(const std::string& auth_token) { |
361 DCHECK(!fetch_pending_) << "Tried to fetch two things at once!"; | 361 DCHECK(!fetch_pending_) << "Tried to fetch two things at once!"; |
362 | 362 |
363 VLOG(1) << "Starting TokenAuth with auth_token=" << auth_token; | 363 DVLOG(1) << "Starting TokenAuth with auth_token=" << auth_token; |
364 | 364 |
365 // The continue URL is a required parameter of the TokenAuth API, but in this | 365 // The continue URL is a required parameter of the TokenAuth API, but in this |
366 // case we don't actually need or want to navigate to it. Setting it to | 366 // case we don't actually need or want to navigate to it. Setting it to |
367 // an arbitrary Google URL. | 367 // an arbitrary Google URL. |
368 std::string continue_url("http://www.google.com"); | 368 std::string continue_url("http://www.google.com"); |
369 request_body_ = MakeTokenAuthBody(auth_token, continue_url, source_); | 369 request_body_ = MakeTokenAuthBody(auth_token, continue_url, source_); |
370 fetcher_.reset(CreateGaiaFetcher(getter_, | 370 fetcher_.reset(CreateGaiaFetcher(getter_, |
371 request_body_, | 371 request_body_, |
372 token_auth_gurl_, | 372 token_auth_gurl_, |
373 false, | 373 false, |
374 this)); | 374 this)); |
375 fetch_pending_ = true; | 375 fetch_pending_ = true; |
376 fetcher_->Start(); | 376 fetcher_->Start(); |
377 } | 377 } |
378 | 378 |
379 void GaiaAuthFetcher::StartMergeSession(const std::string& auth_token) { | 379 void GaiaAuthFetcher::StartMergeSession(const std::string& auth_token) { |
380 DCHECK(!fetch_pending_) << "Tried to fetch two things at once!"; | 380 DCHECK(!fetch_pending_) << "Tried to fetch two things at once!"; |
381 | 381 |
382 VLOG(1) << "Starting MergeSession with auth_token=" << auth_token; | 382 DVLOG(1) << "Starting MergeSession with auth_token=" << auth_token; |
383 | 383 |
384 // The continue URL is a required parameter of the MergeSession API, but in | 384 // The continue URL is a required parameter of the MergeSession API, but in |
385 // this case we don't actually need or want to navigate to it. Setting it to | 385 // this case we don't actually need or want to navigate to it. Setting it to |
386 // an arbitrary Google URL. | 386 // an arbitrary Google URL. |
387 // | 387 // |
388 // In order for the new session to be merged correctly, the server needs to | 388 // In order for the new session to be merged correctly, the server needs to |
389 // know what sessions already exist in the browser. The fetcher needs to be | 389 // know what sessions already exist in the browser. The fetcher needs to be |
390 // created such that it sends the cookies with the request, which is | 390 // created such that it sends the cookies with the request, which is |
391 // different from all other requests the fetcher can make. | 391 // different from all other requests the fetcher can make. |
392 std::string continue_url("http://www.google.com"); | 392 std::string continue_url("http://www.google.com"); |
393 request_body_ = MakeMergeSessionBody(auth_token, continue_url, source_); | 393 request_body_ = MakeMergeSessionBody(auth_token, continue_url, source_); |
394 fetcher_.reset(CreateGaiaFetcher(getter_, | 394 fetcher_.reset(CreateGaiaFetcher(getter_, |
395 request_body_, | 395 request_body_, |
396 merge_session_gurl_, | 396 merge_session_gurl_, |
397 true, | 397 true, |
398 this)); | 398 this)); |
399 fetch_pending_ = true; | 399 fetch_pending_ = true; |
400 fetcher_->Start(); | 400 fetcher_->Start(); |
401 } | 401 } |
402 | 402 |
403 // static | 403 // static |
404 GoogleServiceAuthError GaiaAuthFetcher::GenerateAuthError( | 404 GoogleServiceAuthError GaiaAuthFetcher::GenerateAuthError( |
405 const std::string& data, | 405 const std::string& data, |
406 const net::URLRequestStatus& status) { | 406 const net::URLRequestStatus& status) { |
407 if (!status.is_success()) { | 407 if (!status.is_success()) { |
408 if (status.status() == net::URLRequestStatus::CANCELED) { | 408 if (status.status() == net::URLRequestStatus::CANCELED) { |
409 return GoogleServiceAuthError(GoogleServiceAuthError::REQUEST_CANCELED); | 409 return GoogleServiceAuthError(GoogleServiceAuthError::REQUEST_CANCELED); |
410 } else { | 410 } else { |
411 LOG(WARNING) << "Could not reach Google Accounts servers: errno " | 411 DLOG(WARNING) << "Could not reach Google Accounts servers: errno " |
412 << status.error(); | 412 << status.error(); |
413 return GoogleServiceAuthError::FromConnectionError(status.error()); | 413 return GoogleServiceAuthError::FromConnectionError(status.error()); |
414 } | 414 } |
415 } else { | 415 } else { |
416 if (IsSecondFactorSuccess(data)) { | 416 if (IsSecondFactorSuccess(data)) { |
417 return GoogleServiceAuthError(GoogleServiceAuthError::TWO_FACTOR); | 417 return GoogleServiceAuthError(GoogleServiceAuthError::TWO_FACTOR); |
418 } | 418 } |
419 | 419 |
420 std::string error; | 420 std::string error; |
421 std::string url; | 421 std::string url; |
422 std::string captcha_url; | 422 std::string captcha_url; |
423 std::string captcha_token; | 423 std::string captcha_token; |
424 ParseClientLoginFailure(data, &error, &url, &captcha_url, &captcha_token); | 424 ParseClientLoginFailure(data, &error, &url, &captcha_url, &captcha_token); |
425 LOG(WARNING) << "ClientLogin failed with " << error; | 425 DLOG(WARNING) << "ClientLogin failed with " << error; |
426 | 426 |
427 if (error == kCaptchaError) { | 427 if (error == kCaptchaError) { |
428 GURL image_url( | 428 GURL image_url( |
429 GaiaUrls::GetInstance()->captcha_url_prefix() + captcha_url); | 429 GaiaUrls::GetInstance()->captcha_url_prefix() + captcha_url); |
430 GURL unlock_url(url); | 430 GURL unlock_url(url); |
431 return GoogleServiceAuthError::FromCaptchaChallenge( | 431 return GoogleServiceAuthError::FromCaptchaChallenge( |
432 captcha_token, image_url, unlock_url); | 432 captcha_token, image_url, unlock_url); |
433 } | 433 } |
434 if (error == kAccountDeletedError) | 434 if (error == kAccountDeletedError) |
435 return GoogleServiceAuthError(GoogleServiceAuthError::ACCOUNT_DELETED); | 435 return GoogleServiceAuthError(GoogleServiceAuthError::ACCOUNT_DELETED); |
436 if (error == kAccountDisabledError) | 436 if (error == kAccountDisabledError) |
437 return GoogleServiceAuthError(GoogleServiceAuthError::ACCOUNT_DISABLED); | 437 return GoogleServiceAuthError(GoogleServiceAuthError::ACCOUNT_DISABLED); |
438 if (error == kBadAuthenticationError) { | 438 if (error == kBadAuthenticationError) { |
439 return GoogleServiceAuthError( | 439 return GoogleServiceAuthError( |
440 GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS); | 440 GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS); |
441 } | 441 } |
442 if (error == kServiceUnavailableError) { | 442 if (error == kServiceUnavailableError) { |
443 return GoogleServiceAuthError( | 443 return GoogleServiceAuthError( |
444 GoogleServiceAuthError::SERVICE_UNAVAILABLE); | 444 GoogleServiceAuthError::SERVICE_UNAVAILABLE); |
445 } | 445 } |
446 | 446 |
447 LOG(WARNING) << "Incomprehensible response from Google Accounts servers."; | 447 DLOG(WARNING) << "Incomprehensible response from Google Accounts servers."; |
448 return GoogleServiceAuthError( | 448 return GoogleServiceAuthError( |
449 GoogleServiceAuthError::SERVICE_UNAVAILABLE); | 449 GoogleServiceAuthError::SERVICE_UNAVAILABLE); |
450 } | 450 } |
451 | 451 |
452 NOTREACHED(); | 452 NOTREACHED(); |
453 return GoogleServiceAuthError(GoogleServiceAuthError::SERVICE_UNAVAILABLE); | 453 return GoogleServiceAuthError(GoogleServiceAuthError::SERVICE_UNAVAILABLE); |
454 } | 454 } |
455 | 455 |
456 // static | 456 // static |
457 GoogleServiceAuthError GaiaAuthFetcher::GenerateOAuthLoginError( | 457 GoogleServiceAuthError GaiaAuthFetcher::GenerateOAuthLoginError( |
458 const std::string& data, | 458 const std::string& data, |
459 const net::URLRequestStatus& status) { | 459 const net::URLRequestStatus& status) { |
460 if (!status.is_success()) { | 460 if (!status.is_success()) { |
461 if (status.status() == net::URLRequestStatus::CANCELED) { | 461 if (status.status() == net::URLRequestStatus::CANCELED) { |
462 return GoogleServiceAuthError(GoogleServiceAuthError::REQUEST_CANCELED); | 462 return GoogleServiceAuthError(GoogleServiceAuthError::REQUEST_CANCELED); |
463 } else { | 463 } else { |
464 LOG(WARNING) << "Could not reach Google Accounts servers: errno " | 464 DLOG(WARNING) << "Could not reach Google Accounts servers: errno " |
465 << status.error(); | 465 << status.error(); |
466 return GoogleServiceAuthError::FromConnectionError(status.error()); | 466 return GoogleServiceAuthError::FromConnectionError(status.error()); |
467 } | 467 } |
468 } else { | 468 } else { |
469 if (IsSecondFactorSuccess(data)) { | 469 if (IsSecondFactorSuccess(data)) { |
470 return GoogleServiceAuthError(GoogleServiceAuthError::TWO_FACTOR); | 470 return GoogleServiceAuthError(GoogleServiceAuthError::TWO_FACTOR); |
471 } | 471 } |
472 | 472 |
473 std::string error; | 473 std::string error; |
474 std::string url; | 474 std::string url; |
(...skipping 15 matching lines...) Expand all Loading... |
490 return GoogleServiceAuthError(GoogleServiceAuthError::ACCOUNT_DISABLED); | 490 return GoogleServiceAuthError(GoogleServiceAuthError::ACCOUNT_DISABLED); |
491 if (error == kBadAuthenticationErrorCode) { | 491 if (error == kBadAuthenticationErrorCode) { |
492 return GoogleServiceAuthError( | 492 return GoogleServiceAuthError( |
493 GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS); | 493 GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS); |
494 } | 494 } |
495 if (error == kServiceUnavailableErrorCode) { | 495 if (error == kServiceUnavailableErrorCode) { |
496 return GoogleServiceAuthError( | 496 return GoogleServiceAuthError( |
497 GoogleServiceAuthError::SERVICE_UNAVAILABLE); | 497 GoogleServiceAuthError::SERVICE_UNAVAILABLE); |
498 } | 498 } |
499 | 499 |
500 LOG(WARNING) << "Incomprehensible response from Google Accounts servers."; | 500 DLOG(WARNING) << "Incomprehensible response from Google Accounts servers."; |
501 return GoogleServiceAuthError( | 501 return GoogleServiceAuthError( |
502 GoogleServiceAuthError::SERVICE_UNAVAILABLE); | 502 GoogleServiceAuthError::SERVICE_UNAVAILABLE); |
503 } | 503 } |
504 | 504 |
505 NOTREACHED(); | 505 NOTREACHED(); |
506 return GoogleServiceAuthError(GoogleServiceAuthError::SERVICE_UNAVAILABLE); | 506 return GoogleServiceAuthError(GoogleServiceAuthError::SERVICE_UNAVAILABLE); |
507 } | 507 } |
508 | 508 |
509 void GaiaAuthFetcher::OnClientLoginFetched(const std::string& data, | 509 void GaiaAuthFetcher::OnClientLoginFetched(const std::string& data, |
510 const net::URLRequestStatus& status, | 510 const net::URLRequestStatus& status, |
511 int response_code) { | 511 int response_code) { |
512 if (status.is_success() && response_code == RC_REQUEST_OK) { | 512 if (status.is_success() && response_code == RC_REQUEST_OK) { |
513 VLOG(1) << "ClientLogin successful!"; | 513 DVLOG(1) << "ClientLogin successful!"; |
514 std::string sid; | 514 std::string sid; |
515 std::string lsid; | 515 std::string lsid; |
516 std::string token; | 516 std::string token; |
517 ParseClientLoginResponse(data, &sid, &lsid, &token); | 517 ParseClientLoginResponse(data, &sid, &lsid, &token); |
518 consumer_->OnClientLoginSuccess( | 518 consumer_->OnClientLoginSuccess( |
519 GaiaAuthConsumer::ClientLoginResult(sid, lsid, token, data)); | 519 GaiaAuthConsumer::ClientLoginResult(sid, lsid, token, data)); |
520 } else { | 520 } else { |
521 consumer_->OnClientLoginFailure(GenerateAuthError(data, status)); | 521 consumer_->OnClientLoginFailure(GenerateAuthError(data, status)); |
522 } | 522 } |
523 } | 523 } |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
603 NOTREACHED(); | 603 NOTREACHED(); |
604 } | 604 } |
605 } | 605 } |
606 | 606 |
607 // static | 607 // static |
608 bool GaiaAuthFetcher::IsSecondFactorSuccess( | 608 bool GaiaAuthFetcher::IsSecondFactorSuccess( |
609 const std::string& alleged_error) { | 609 const std::string& alleged_error) { |
610 return alleged_error.find(kSecondFactor) != | 610 return alleged_error.find(kSecondFactor) != |
611 std::string::npos; | 611 std::string::npos; |
612 } | 612 } |
OLD | NEW |