Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(49)

Side by Side Diff: chrome/common/net/gaia/gaia_auth_fetcher.cc

Issue 7600003: Pre- and Auto-login should not log the user out of an already signed in (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 9 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
47 "service=%s&" 47 "service=%s&"
48 "Session=%s"; 48 "Session=%s";
49 // static 49 // static
50 const char GaiaAuthFetcher::kGetUserInfoFormat[] = 50 const char GaiaAuthFetcher::kGetUserInfoFormat[] =
51 "LSID=%s"; 51 "LSID=%s";
52 // static 52 // static
53 const char GaiaAuthFetcher::kTokenAuthFormat[] = 53 const char GaiaAuthFetcher::kTokenAuthFormat[] =
54 "auth=%s&" 54 "auth=%s&"
55 "continue=%s&" 55 "continue=%s&"
56 "source=%s"; 56 "source=%s";
57 // static
58 const char GaiaAuthFetcher::kMergeSessionFormat[] =
59 "uberauth=%s&"
60 "continue=%s&"
61 "source=%s";
57 62
58 // static 63 // static
59 const char GaiaAuthFetcher::kAccountDeletedError[] = "AccountDeleted"; 64 const char GaiaAuthFetcher::kAccountDeletedError[] = "AccountDeleted";
60 const char GaiaAuthFetcher::kAccountDeletedErrorCode[] = "adel"; 65 const char GaiaAuthFetcher::kAccountDeletedErrorCode[] = "adel";
61 // static 66 // static
62 const char GaiaAuthFetcher::kAccountDisabledError[] = "AccountDisabled"; 67 const char GaiaAuthFetcher::kAccountDisabledError[] = "AccountDisabled";
63 const char GaiaAuthFetcher::kAccountDisabledErrorCode[] = "adis"; 68 const char GaiaAuthFetcher::kAccountDisabledErrorCode[] = "adis";
64 // static 69 // static
65 const char GaiaAuthFetcher::kBadAuthenticationError[] = "BadAuthentication"; 70 const char GaiaAuthFetcher::kBadAuthenticationError[] = "BadAuthentication";
66 const char GaiaAuthFetcher::kBadAuthenticationErrorCode[] = "badauth"; 71 const char GaiaAuthFetcher::kBadAuthenticationErrorCode[] = "badauth";
(...skipping 30 matching lines...) Expand all
97 GaiaAuthFetcher::GaiaAuthFetcher(GaiaAuthConsumer* consumer, 102 GaiaAuthFetcher::GaiaAuthFetcher(GaiaAuthConsumer* consumer,
98 const std::string& source, 103 const std::string& source,
99 net::URLRequestContextGetter* getter) 104 net::URLRequestContextGetter* getter)
100 : consumer_(consumer), 105 : consumer_(consumer),
101 getter_(getter), 106 getter_(getter),
102 source_(source), 107 source_(source),
103 client_login_gurl_(GaiaUrls::GetInstance()->client_login_url()), 108 client_login_gurl_(GaiaUrls::GetInstance()->client_login_url()),
104 issue_auth_token_gurl_(GaiaUrls::GetInstance()->issue_auth_token_url()), 109 issue_auth_token_gurl_(GaiaUrls::GetInstance()->issue_auth_token_url()),
105 get_user_info_gurl_(GaiaUrls::GetInstance()->get_user_info_url()), 110 get_user_info_gurl_(GaiaUrls::GetInstance()->get_user_info_url()),
106 token_auth_gurl_(GaiaUrls::GetInstance()->token_auth_url()), 111 token_auth_gurl_(GaiaUrls::GetInstance()->token_auth_url()),
112 merge_session_gurl_(GaiaUrls::GetInstance()->merge_session_url()),
107 fetch_pending_(false) {} 113 fetch_pending_(false) {}
108 114
109 GaiaAuthFetcher::~GaiaAuthFetcher() {} 115 GaiaAuthFetcher::~GaiaAuthFetcher() {}
110 116
111 bool GaiaAuthFetcher::HasPendingFetch() { 117 bool GaiaAuthFetcher::HasPendingFetch() {
112 return fetch_pending_; 118 return fetch_pending_;
113 } 119 }
114 120
115 void GaiaAuthFetcher::CancelRequest() { 121 void GaiaAuthFetcher::CancelRequest() {
116 fetcher_.reset(); 122 fetcher_.reset();
117 fetch_pending_ = false; 123 fetch_pending_ = false;
118 } 124 }
119 125
120 // static 126 // static
121 URLFetcher* GaiaAuthFetcher::CreateGaiaFetcher( 127 URLFetcher* GaiaAuthFetcher::CreateGaiaFetcher(
122 net::URLRequestContextGetter* getter, 128 net::URLRequestContextGetter* getter,
123 const std::string& body, 129 const std::string& body,
124 const GURL& gaia_gurl, 130 const GURL& gaia_gurl,
125 URLFetcher::Delegate* delegate) { 131 URLFetcher::Delegate* delegate) {
132 return CreateGaiaFetcherWithFlags(getter, body, gaia_gurl,
133 net::LOAD_DO_NOT_SEND_COOKIES, delegate);
134 }
135
136 // static
137 URLFetcher* GaiaAuthFetcher::CreateGaiaFetcherWithFlags(
138 net::URLRequestContextGetter* getter,
139 const std::string& body,
140 const GURL& gaia_gurl,
141 int flags,
142 URLFetcher::Delegate* delegate) {
126 143
127 URLFetcher* to_return = 144 URLFetcher* to_return =
128 URLFetcher::Create(0, 145 URLFetcher::Create(0,
129 gaia_gurl, 146 gaia_gurl,
130 URLFetcher::POST, 147 URLFetcher::POST,
131 delegate); 148 delegate);
132 to_return->set_request_context(getter); 149 to_return->set_request_context(getter);
133 to_return->set_load_flags(net::LOAD_DO_NOT_SEND_COOKIES); 150 to_return->set_load_flags(flags);
134 to_return->set_upload_data("application/x-www-form-urlencoded", body); 151 to_return->set_upload_data("application/x-www-form-urlencoded", body);
135 return to_return; 152 return to_return;
136 } 153 }
137 154
138 // static 155 // static
139 std::string GaiaAuthFetcher::MakeClientLoginBody( 156 std::string GaiaAuthFetcher::MakeClientLoginBody(
140 const std::string& username, 157 const std::string& username,
141 const std::string& password, 158 const std::string& password,
142 const std::string& source, 159 const std::string& source,
143 const char* service, 160 const char* service,
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
206 const std::string& source) { 223 const std::string& source) {
207 std::string encoded_auth_token = EscapeUrlEncodedData(auth_token, true); 224 std::string encoded_auth_token = EscapeUrlEncodedData(auth_token, true);
208 std::string encoded_continue_url = EscapeUrlEncodedData(continue_url, true); 225 std::string encoded_continue_url = EscapeUrlEncodedData(continue_url, true);
209 std::string encoded_source = EscapeUrlEncodedData(source, true); 226 std::string encoded_source = EscapeUrlEncodedData(source, true);
210 return base::StringPrintf(kTokenAuthFormat, 227 return base::StringPrintf(kTokenAuthFormat,
211 encoded_auth_token.c_str(), 228 encoded_auth_token.c_str(),
212 encoded_continue_url.c_str(), 229 encoded_continue_url.c_str(),
213 encoded_source.c_str()); 230 encoded_source.c_str());
214 } 231 }
215 232
233 // static
234 std::string GaiaAuthFetcher::MakeMergeSessionBody(
235 const std::string& auth_token,
236 const std::string& continue_url,
237 const std::string& source) {
238 std::string encoded_auth_token = EscapeUrlEncodedData(auth_token, true);
239 std::string encoded_continue_url = EscapeUrlEncodedData(continue_url, true);
240 std::string encoded_source = EscapeUrlEncodedData(source, true);
241 return base::StringPrintf(kMergeSessionFormat,
242 encoded_auth_token.c_str(),
243 encoded_continue_url.c_str(),
244 encoded_source.c_str());
245 }
246
216 // Helper method that extracts tokens from a successful reply. 247 // Helper method that extracts tokens from a successful reply.
217 // static 248 // static
218 void GaiaAuthFetcher::ParseClientLoginResponse(const std::string& data, 249 void GaiaAuthFetcher::ParseClientLoginResponse(const std::string& data,
219 std::string* sid, 250 std::string* sid,
220 std::string* lsid, 251 std::string* lsid,
221 std::string* token) { 252 std::string* token) {
222 using std::vector; 253 using std::vector;
223 using std::pair; 254 using std::pair;
224 using std::string; 255 using std::string;
225 256
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
335 std::string continue_url("http://www.google.com"); 366 std::string continue_url("http://www.google.com");
336 request_body_ = MakeTokenAuthBody(auth_token, continue_url, source_); 367 request_body_ = MakeTokenAuthBody(auth_token, continue_url, source_);
337 fetcher_.reset(CreateGaiaFetcher(getter_, 368 fetcher_.reset(CreateGaiaFetcher(getter_,
338 request_body_, 369 request_body_,
339 token_auth_gurl_, 370 token_auth_gurl_,
340 this)); 371 this));
341 fetch_pending_ = true; 372 fetch_pending_ = true;
342 fetcher_->Start(); 373 fetcher_->Start();
343 } 374 }
344 375
376 void GaiaAuthFetcher::StartMergeSession(const std::string& auth_token) {
377 DCHECK(!fetch_pending_) << "Tried to fetch two things at once!";
378
379 VLOG(1) << "Starting MergeSession with auth_token=" << auth_token;
380
381 // The continue URL is a required parameter of the MergeSession API, but in
382 // this case we don't actually need or want to navigate to it. Setting it to
383 // an arbitrary Google URL.
384 //
385 // In order for the new session to be merged correctly, the server needs to
386 // know what sessions already exist in the browser. The fecther needs to be
Rick Campbell 2011/08/08 21:24:51 TYPO: fetcher
Roger Tawa OOO till Jul 10th 2011/08/09 20:50:49 Done.
387 // created such that it sends the cookies with the request, which is
388 // different from all other requests the fetcher can make.
389 std::string continue_url("http://www.google.com");
390 request_body_ = MakeMergeSessionBody(auth_token, continue_url, source_);
391 fetcher_.reset(CreateGaiaFetcherWithFlags(getter_,
392 request_body_,
393 merge_session_gurl_,
394 net::LOAD_NORMAL,
Rick Campbell 2011/08/08 21:24:51 Just looping back to my comment about preferring a
Roger Tawa OOO till Jul 10th 2011/08/09 20:50:49 Done.
395 this));
396 fetch_pending_ = true;
397 fetcher_->Start();
398 }
399
345 // static 400 // static
346 GoogleServiceAuthError GaiaAuthFetcher::GenerateAuthError( 401 GoogleServiceAuthError GaiaAuthFetcher::GenerateAuthError(
347 const std::string& data, 402 const std::string& data,
348 const net::URLRequestStatus& status) { 403 const net::URLRequestStatus& status) {
349 if (!status.is_success()) { 404 if (!status.is_success()) {
350 if (status.status() == net::URLRequestStatus::CANCELED) { 405 if (status.status() == net::URLRequestStatus::CANCELED) {
351 return GoogleServiceAuthError(GoogleServiceAuthError::REQUEST_CANCELED); 406 return GoogleServiceAuthError(GoogleServiceAuthError::REQUEST_CANCELED);
352 } else { 407 } else {
353 LOG(WARNING) << "Could not reach Google Accounts servers: errno " 408 LOG(WARNING) << "Could not reach Google Accounts servers: errno "
354 << status.os_error(); 409 << status.os_error();
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
505 void GaiaAuthFetcher::OnTokenAuthFetched(const std::string& data, 560 void GaiaAuthFetcher::OnTokenAuthFetched(const std::string& data,
506 const net::URLRequestStatus& status, 561 const net::URLRequestStatus& status,
507 int response_code) { 562 int response_code) {
508 if (status.is_success() && response_code == RC_REQUEST_OK) { 563 if (status.is_success() && response_code == RC_REQUEST_OK) {
509 consumer_->OnTokenAuthSuccess(data); 564 consumer_->OnTokenAuthSuccess(data);
510 } else { 565 } else {
511 consumer_->OnTokenAuthFailure(GenerateAuthError(data, status)); 566 consumer_->OnTokenAuthFailure(GenerateAuthError(data, status));
512 } 567 }
513 } 568 }
514 569
570 void GaiaAuthFetcher::OnMergeSessionFetched(const std::string& data,
571 const net::URLRequestStatus& status,
572 int response_code) {
573 if (status.is_success() && response_code == RC_REQUEST_OK) {
574 consumer_->OnMergeSessionSuccess(data);
575 } else {
576 consumer_->OnMergeSessionFailure(GenerateAuthError(data, status));
577 }
578 }
579
515 void GaiaAuthFetcher::OnURLFetchComplete(const URLFetcher* source, 580 void GaiaAuthFetcher::OnURLFetchComplete(const URLFetcher* source,
516 const GURL& url, 581 const GURL& url,
517 const net::URLRequestStatus& status, 582 const net::URLRequestStatus& status,
518 int response_code, 583 int response_code,
519 const net::ResponseCookies& cookies, 584 const net::ResponseCookies& cookies,
520 const std::string& data) { 585 const std::string& data) {
521 fetch_pending_ = false; 586 fetch_pending_ = false;
522 if (url == client_login_gurl_) { 587 if (url == client_login_gurl_) {
523 OnClientLoginFetched(data, status, response_code); 588 OnClientLoginFetched(data, status, response_code);
524 } else if (url == issue_auth_token_gurl_) { 589 } else if (url == issue_auth_token_gurl_) {
525 OnIssueAuthTokenFetched(data, status, response_code); 590 OnIssueAuthTokenFetched(data, status, response_code);
526 } else if (url == get_user_info_gurl_) { 591 } else if (url == get_user_info_gurl_) {
527 OnGetUserInfoFetched(data, status, response_code); 592 OnGetUserInfoFetched(data, status, response_code);
528 } else if (url == token_auth_gurl_) { 593 } else if (url == token_auth_gurl_) {
529 OnTokenAuthFetched(data, status, response_code); 594 OnTokenAuthFetched(data, status, response_code);
595 } else if (url == merge_session_gurl_ ||
596 (source && source->original_url() == merge_session_gurl_)) {
597 // MergeSession may redirect, so check the original URL of the fetcher.
598 OnMergeSessionFetched(data, status, response_code);
530 } else { 599 } else {
531 NOTREACHED(); 600 NOTREACHED();
532 } 601 }
533 } 602 }
534 603
535 // static 604 // static
536 bool GaiaAuthFetcher::IsSecondFactorSuccess( 605 bool GaiaAuthFetcher::IsSecondFactorSuccess(
537 const std::string& alleged_error) { 606 const std::string& alleged_error) {
538 return alleged_error.find(kSecondFactor) != 607 return alleged_error.find(kSecondFactor) !=
539 std::string::npos; 608 std::string::npos;
540 } 609 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698