| 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/browser/net/gaia/gaia_oauth_fetcher.h" | 5 #include "chrome/browser/net/gaia/gaia_oauth_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 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 42 | 42 |
| 43 static const char kOAuthWrapBridgeUserInfoScope[] = | 43 static const char kOAuthWrapBridgeUserInfoScope[] = |
| 44 "https://www.googleapis.com/auth/userinfo.email"; | 44 "https://www.googleapis.com/auth/userinfo.email"; |
| 45 | 45 |
| 46 static const char kOAuth1LoginScope[] = | 46 static const char kOAuth1LoginScope[] = |
| 47 "https://www.google.com/accounts/OAuthLogin"; | 47 "https://www.google.com/accounts/OAuthLogin"; |
| 48 | 48 |
| 49 static const char kUserInfoUrl[] = | 49 static const char kUserInfoUrl[] = |
| 50 "https://www.googleapis.com/oauth2/v1/userinfo"; | 50 "https://www.googleapis.com/oauth2/v1/userinfo"; |
| 51 | 51 |
| 52 static const char kRevokeTokenUrl[] = |
| 53 "https://www.google.com/accounts/AuthSubRevokeToken"; |
| 54 |
| 52 static const char kOAuthTokenCookie[] = "oauth_token"; | 55 static const char kOAuthTokenCookie[] = "oauth_token"; |
| 53 | 56 |
| 54 GaiaOAuthFetcher::GaiaOAuthFetcher(GaiaOAuthConsumer* consumer, | 57 GaiaOAuthFetcher::GaiaOAuthFetcher(GaiaOAuthConsumer* consumer, |
| 55 net::URLRequestContextGetter* getter, | 58 net::URLRequestContextGetter* getter, |
| 56 Profile* profile, | 59 Profile* profile, |
| 57 const std::string& service_scope) | 60 const std::string& service_scope) |
| 58 : consumer_(consumer), | 61 : consumer_(consumer), |
| 59 getter_(getter), | 62 getter_(getter), |
| 60 profile_(profile), | 63 profile_(profile), |
| 61 popup_(NULL), | 64 popup_(NULL), |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 119 // static | 122 // static |
| 120 std::string GaiaOAuthFetcher::MakeOAuthLoginBody( | 123 std::string GaiaOAuthFetcher::MakeOAuthLoginBody( |
| 121 const char* source, | 124 const char* source, |
| 122 const char* service, | 125 const char* service, |
| 123 const std::string& oauth1_access_token, | 126 const std::string& oauth1_access_token, |
| 124 const std::string& oauth1_access_token_secret) { | 127 const std::string& oauth1_access_token_secret) { |
| 125 OAuthRequestSigner::Parameters parameters; | 128 OAuthRequestSigner::Parameters parameters; |
| 126 parameters["service"] = service; | 129 parameters["service"] = service; |
| 127 parameters["source"] = source; | 130 parameters["source"] = source; |
| 128 std::string signed_request; | 131 std::string signed_request; |
| 129 bool is_signed = OAuthRequestSigner::Sign( | 132 bool is_signed = OAuthRequestSigner::SignURL( |
| 130 GURL(kOAuth1LoginScope), | 133 GURL(kOAuth1LoginScope), |
| 131 parameters, | 134 parameters, |
| 132 OAuthRequestSigner::HMAC_SHA1_SIGNATURE, | 135 OAuthRequestSigner::HMAC_SHA1_SIGNATURE, |
| 133 OAuthRequestSigner::POST_METHOD, | 136 OAuthRequestSigner::POST_METHOD, |
| 134 "anonymous", // oauth_consumer_key | 137 "anonymous", // oauth_consumer_key |
| 135 "anonymous", // consumer secret | 138 "anonymous", // consumer secret |
| 136 oauth1_access_token, // oauth_token | 139 oauth1_access_token, // oauth_token |
| 137 oauth1_access_token_secret, // token secret | 140 oauth1_access_token_secret, // token secret |
| 138 &signed_request); | 141 &signed_request); |
| 139 DCHECK(is_signed); | 142 DCHECK(is_signed); |
| 140 return signed_request; | 143 return signed_request; |
| 141 } | 144 } |
| 142 | 145 |
| 143 // static | 146 // static |
| 144 std::string GaiaOAuthFetcher::MakeOAuthGetAccessTokenBody( | 147 std::string GaiaOAuthFetcher::MakeOAuthGetAccessTokenBody( |
| 145 const std::string& oauth1_request_token) { | 148 const std::string& oauth1_request_token) { |
| 146 OAuthRequestSigner::Parameters empty_parameters; | 149 OAuthRequestSigner::Parameters empty_parameters; |
| 147 std::string signed_request; | 150 std::string signed_request; |
| 148 bool is_signed = OAuthRequestSigner::Sign( | 151 bool is_signed = OAuthRequestSigner::SignURL( |
| 149 GURL(kOAuthGetAccessTokenUrl), | 152 GURL(kOAuthGetAccessTokenUrl), |
| 150 empty_parameters, | 153 empty_parameters, |
| 151 OAuthRequestSigner::HMAC_SHA1_SIGNATURE, | 154 OAuthRequestSigner::HMAC_SHA1_SIGNATURE, |
| 152 OAuthRequestSigner::POST_METHOD, | 155 OAuthRequestSigner::POST_METHOD, |
| 153 "anonymous", // oauth_consumer_key | 156 "anonymous", // oauth_consumer_key |
| 154 "anonymous", // consumer secret | 157 "anonymous", // consumer secret |
| 155 oauth1_request_token, // oauth_token | 158 oauth1_request_token, // oauth_token |
| 156 "", // token secret | 159 "", // token secret |
| 157 &signed_request); | 160 &signed_request); |
| 158 DCHECK(is_signed); | 161 DCHECK(is_signed); |
| 159 return signed_request; | 162 return signed_request; |
| 160 } | 163 } |
| 161 | 164 |
| 162 // static | 165 // static |
| 163 std::string GaiaOAuthFetcher::MakeOAuthWrapBridgeBody( | 166 std::string GaiaOAuthFetcher::MakeOAuthWrapBridgeBody( |
| 164 const std::string& oauth1_access_token, | 167 const std::string& oauth1_access_token, |
| 165 const std::string& oauth1_access_token_secret, | 168 const std::string& oauth1_access_token_secret, |
| 166 const std::string& wrap_token_duration, | 169 const std::string& wrap_token_duration, |
| 167 const std::string& oauth2_scope) { | 170 const std::string& oauth2_scope) { |
| 168 OAuthRequestSigner::Parameters parameters; | 171 OAuthRequestSigner::Parameters parameters; |
| 169 parameters["wrap_token_duration"] = wrap_token_duration; | 172 parameters["wrap_token_duration"] = wrap_token_duration; |
| 170 parameters["wrap_scope"] = oauth2_scope; | 173 parameters["wrap_scope"] = oauth2_scope; |
| 171 std::string signed_request; | 174 std::string signed_request; |
| 172 bool is_signed = OAuthRequestSigner::Sign( | 175 bool is_signed = OAuthRequestSigner::SignURL( |
| 173 GURL(kOAuthWrapBridgeUrl), | 176 GURL(kOAuthWrapBridgeUrl), |
| 174 parameters, | 177 parameters, |
| 175 OAuthRequestSigner::HMAC_SHA1_SIGNATURE, | 178 OAuthRequestSigner::HMAC_SHA1_SIGNATURE, |
| 176 OAuthRequestSigner::POST_METHOD, | 179 OAuthRequestSigner::POST_METHOD, |
| 177 "anonymous", // oauth_consumer_key | 180 "anonymous", // oauth_consumer_key |
| 178 "anonymous", // consumer secret | 181 "anonymous", // consumer secret |
| 179 oauth1_access_token, // oauth_token | 182 oauth1_access_token, // oauth_token |
| 180 oauth1_access_token_secret, // token secret | 183 oauth1_access_token_secret, // token secret |
| 181 &signed_request); | 184 &signed_request); |
| 182 DCHECK(is_signed); | 185 DCHECK(is_signed); |
| (...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 440 fetcher_.reset(CreateGaiaFetcher(getter_, | 443 fetcher_.reset(CreateGaiaFetcher(getter_, |
| 441 GURL(kUserInfoUrl), | 444 GURL(kUserInfoUrl), |
| 442 request_body_, | 445 request_body_, |
| 443 request_headers_, | 446 request_headers_, |
| 444 false, | 447 false, |
| 445 this)); | 448 this)); |
| 446 fetch_pending_ = true; | 449 fetch_pending_ = true; |
| 447 fetcher_->Start(); | 450 fetcher_->Start(); |
| 448 } | 451 } |
| 449 | 452 |
| 453 void GaiaOAuthFetcher::StartOAuthRevokeAccessToken(const std::string& token, |
| 454 const std::string& secret) { |
| 455 DCHECK(!fetch_pending_) << "Tried to fetch two things at once!"; |
| 456 |
| 457 // Must outlive fetcher_. |
| 458 request_body_ = ""; |
| 459 |
| 460 OAuthRequestSigner::Parameters empty_parameters; |
| 461 std::string auth_header; |
| 462 GURL url(kRevokeTokenUrl); |
| 463 bool is_signed = OAuthRequestSigner::SignAuthHeader( |
| 464 url, |
| 465 empty_parameters, |
| 466 OAuthRequestSigner::HMAC_SHA1_SIGNATURE, |
| 467 OAuthRequestSigner::GET_METHOD, |
| 468 "anonymous", |
| 469 "anonymous", |
| 470 token, |
| 471 secret, |
| 472 &auth_header); |
| 473 DCHECK(is_signed); |
| 474 request_headers_ = "Authorization: " + auth_header; |
| 475 fetcher_.reset(CreateGaiaFetcher(getter_, url, request_body_, |
| 476 request_headers_, false, this)); |
| 477 fetch_pending_ = true; |
| 478 fetcher_->Start(); |
| 479 } |
| 480 |
| 481 void GaiaOAuthFetcher::StartOAuthRevokeWrapToken(const std::string& token) { |
| 482 DCHECK(!fetch_pending_) << "Tried to fetch two things at once!"; |
| 483 |
| 484 // Must outlive fetcher_. |
| 485 request_body_ = ""; |
| 486 |
| 487 request_headers_ = "Authorization: Bearer " + token; |
| 488 GURL url(kRevokeTokenUrl); |
| 489 fetcher_.reset(CreateGaiaFetcher(getter_, url, request_body_, |
| 490 request_headers_, false, this)); |
| 491 fetch_pending_ = true; |
| 492 fetcher_->Start(); |
| 493 } |
| 494 |
| 450 // static | 495 // static |
| 451 GoogleServiceAuthError GaiaOAuthFetcher::GenerateAuthError( | 496 GoogleServiceAuthError GaiaOAuthFetcher::GenerateAuthError( |
| 452 const std::string& data, | 497 const std::string& data, |
| 453 const net::URLRequestStatus& status) { | 498 const net::URLRequestStatus& status) { |
| 454 if (!status.is_success()) { | 499 if (!status.is_success()) { |
| 455 if (status.status() == net::URLRequestStatus::CANCELED) { | 500 if (status.status() == net::URLRequestStatus::CANCELED) { |
| 456 return GoogleServiceAuthError(GoogleServiceAuthError::REQUEST_CANCELED); | 501 return GoogleServiceAuthError(GoogleServiceAuthError::REQUEST_CANCELED); |
| 457 } else { | 502 } else { |
| 458 LOG(WARNING) << "Could not reach Google Accounts servers: errno " | 503 LOG(WARNING) << "Could not reach Google Accounts servers: errno " |
| 459 << status.os_error(); | 504 << status.os_error(); |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 610 ParseOAuthWrapBridgeResponse(data, &token, &expires_in); | 655 ParseOAuthWrapBridgeResponse(data, &token, &expires_in); |
| 611 consumer_->OnOAuthWrapBridgeSuccess(service_scope_, token, expires_in); | 656 consumer_->OnOAuthWrapBridgeSuccess(service_scope_, token, expires_in); |
| 612 if (ShouldAutoFetch(USER_INFO)) | 657 if (ShouldAutoFetch(USER_INFO)) |
| 613 StartUserInfo(token); | 658 StartUserInfo(token); |
| 614 } else { | 659 } else { |
| 615 consumer_->OnOAuthWrapBridgeFailure(service_scope_, | 660 consumer_->OnOAuthWrapBridgeFailure(service_scope_, |
| 616 GenerateAuthError(data, status)); | 661 GenerateAuthError(data, status)); |
| 617 } | 662 } |
| 618 } | 663 } |
| 619 | 664 |
| 665 void GaiaOAuthFetcher::OnOAuthRevokeTokenFetched( |
| 666 const std::string& data, |
| 667 const net::URLRequestStatus& status, |
| 668 int response_code) { |
| 669 if (status.is_success() && response_code == RC_REQUEST_OK) { |
| 670 consumer_->OnOAuthRevokeTokenSuccess(); |
| 671 } else { |
| 672 LOG(ERROR) << "Token revocation failure " << response_code << ": " << data; |
| 673 consumer_->OnOAuthRevokeTokenFailure(GenerateAuthError(data, status)); |
| 674 } |
| 675 } |
| 676 |
| 620 void GaiaOAuthFetcher::OnUserInfoFetched( | 677 void GaiaOAuthFetcher::OnUserInfoFetched( |
| 621 const std::string& data, | 678 const std::string& data, |
| 622 const net::URLRequestStatus& status, | 679 const net::URLRequestStatus& status, |
| 623 int response_code) { | 680 int response_code) { |
| 624 if (status.is_success() && response_code == RC_REQUEST_OK) { | 681 if (status.is_success() && response_code == RC_REQUEST_OK) { |
| 625 std::string email; | 682 std::string email; |
| 626 ParseUserInfoResponse(data, &email); | 683 ParseUserInfoResponse(data, &email); |
| 627 VLOG(1) << "GAIA user info fetched for " << email << "."; | 684 VLOG(1) << "GAIA user info fetched for " << email << "."; |
| 628 consumer_->OnUserInfoSuccess(email); | 685 consumer_->OnUserInfoSuccess(email); |
| 629 } else { | 686 } else { |
| (...skipping 13 matching lines...) Expand all Loading... |
| 643 if (StartsWithASCII(url.spec(), kGetOAuthTokenUrl, true)) { | 700 if (StartsWithASCII(url.spec(), kGetOAuthTokenUrl, true)) { |
| 644 OnGetOAuthTokenUrlFetched(cookies, status, response_code); | 701 OnGetOAuthTokenUrlFetched(cookies, status, response_code); |
| 645 } else if (url.spec() == kOAuth1LoginScope) { | 702 } else if (url.spec() == kOAuth1LoginScope) { |
| 646 OnOAuthLoginFetched(data, status, response_code); | 703 OnOAuthLoginFetched(data, status, response_code); |
| 647 } else if (url.spec() == kOAuthGetAccessTokenUrl) { | 704 } else if (url.spec() == kOAuthGetAccessTokenUrl) { |
| 648 OnOAuthGetAccessTokenFetched(data, status, response_code); | 705 OnOAuthGetAccessTokenFetched(data, status, response_code); |
| 649 } else if (url.spec() == kOAuthWrapBridgeUrl) { | 706 } else if (url.spec() == kOAuthWrapBridgeUrl) { |
| 650 OnOAuthWrapBridgeFetched(data, status, response_code); | 707 OnOAuthWrapBridgeFetched(data, status, response_code); |
| 651 } else if (url.spec() == kUserInfoUrl) { | 708 } else if (url.spec() == kUserInfoUrl) { |
| 652 OnUserInfoFetched(data, status, response_code); | 709 OnUserInfoFetched(data, status, response_code); |
| 710 } else if (StartsWithASCII(url.spec(), kRevokeTokenUrl, true)) { |
| 711 OnOAuthRevokeTokenFetched(data, status, response_code); |
| 653 } else { | 712 } else { |
| 654 NOTREACHED(); | 713 NOTREACHED(); |
| 655 } | 714 } |
| 656 } | 715 } |
| 657 | 716 |
| 658 bool GaiaOAuthFetcher::ShouldAutoFetch(AutoFetchLimit fetch_step) { | 717 bool GaiaOAuthFetcher::ShouldAutoFetch(AutoFetchLimit fetch_step) { |
| 659 return fetch_step <= auto_fetch_limit_; | 718 return fetch_step <= auto_fetch_limit_; |
| 660 } | 719 } |
| OLD | NEW |