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

Unified Diff: chrome/common/net/gaia/gaia_authenticator2.cc

Issue 2834042: Add IssueAuthToken and unit tests to GaiaAuthenticator2. (Closed)
Patch Set: Created 10 years, 5 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/common/net/gaia/gaia_authenticator2.h ('k') | chrome/common/net/gaia/gaia_authenticator2_unittest.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/common/net/gaia/gaia_authenticator2.cc
diff --git a/chrome/common/net/gaia/gaia_authenticator2.cc b/chrome/common/net/gaia/gaia_authenticator2.cc
index fd480f1226d53d5871cf1dbb39c042c2fde4743b..8ff2fc217eaaaa710b80fda27b3a1ddce021043f 100644
--- a/chrome/common/net/gaia/gaia_authenticator2.cc
+++ b/chrome/common/net/gaia/gaia_authenticator2.cc
@@ -34,6 +34,12 @@ const char GaiaAuthenticator2::kClientLoginCaptchaFormat[] =
"service=%s&"
"logintoken=%s&"
"logincaptcha=%s";
+// static
+const char GaiaAuthenticator2::kIssueAuthTokenFormat[] =
+ "SID=%s&"
+ "LSID=%s&"
+ "service=%s&"
+ "Session=true";
// static
const char GaiaAuthenticator2::kCookiePersistence[] = "true";
@@ -53,12 +59,6 @@ const char GaiaAuthenticator2::kClientLoginUrl[] =
"https://www.google.com/accounts/ClientLogin";
const char GaiaAuthenticator2::kIssueAuthTokenUrl[] =
"https://www.google.com/accounts/IssueAuthToken";
-// TODO(chron): Fix this URL not to hardcode source
-// TODO(cmasone): make sure that using an http:// URL in the "continue"
-// parameter here doesn't open the system up to attack long-term.
-const char GaiaAuthenticator2::kTokenAuthUrl[] =
- "https://www.google.com/accounts/TokenAuth?"
- "continue=http://www.google.com/webhp&source=chromeos&auth=";
GaiaAuthenticator2::GaiaAuthenticator2(GaiaAuthConsumer* consumer,
const std::string& source,
@@ -67,7 +67,8 @@ GaiaAuthenticator2::GaiaAuthenticator2(GaiaAuthConsumer* consumer,
getter_(getter),
source_(source),
client_login_gurl_(kClientLoginUrl),
- fetch_pending_(false){}
+ issue_auth_token_gurl_(kIssueAuthTokenUrl),
+ fetch_pending_(false) {}
GaiaAuthenticator2::~GaiaAuthenticator2() {}
@@ -81,15 +82,15 @@ void GaiaAuthenticator2::CancelRequest() {
}
// static
-URLFetcher* GaiaAuthenticator2::CreateClientLoginFetcher(
+URLFetcher* GaiaAuthenticator2::CreateGaiaFetcher(
URLRequestContextGetter* getter,
const std::string& body,
- const GURL& client_login_gurl,
+ const GURL& gaia_gurl,
URLFetcher::Delegate* delegate) {
URLFetcher* to_return =
URLFetcher::Create(0,
- client_login_gurl,
+ gaia_gurl,
URLFetcher::POST,
delegate);
to_return->set_request_context(getter);
@@ -98,7 +99,8 @@ URLFetcher* GaiaAuthenticator2::CreateClientLoginFetcher(
return to_return;
}
-std::string GaiaAuthenticator2::GenerateRequestBody(
+// static
+std::string GaiaAuthenticator2::MakeClientLoginBody(
const std::string& username,
const std::string& password,
const std::string& source,
@@ -128,8 +130,19 @@ std::string GaiaAuthenticator2::GenerateRequestBody(
}
-// Helper method that extracts tokens from a successful reply, and saves them
-// in the right fields.
+// static
+std::string GaiaAuthenticator2::MakeIssueAuthTokenBody(
+ const std::string& sid,
+ const std::string& lsid,
+ const char* const service) {
+
+ return StringPrintf(kIssueAuthTokenFormat,
+ UrlEncodeString(sid).c_str(),
+ UrlEncodeString(lsid).c_str(),
+ service);
+}
+
+// Helper method that extracts tokens from a successful reply.
// static
void GaiaAuthenticator2::ParseClientLoginResponse(const std::string& data,
std::string* sid,
@@ -155,46 +168,53 @@ void GaiaAuthenticator2::ParseClientLoginResponse(const std::string& data,
void GaiaAuthenticator2::StartClientLogin(const std::string& username,
const std::string& password,
- const char* service,
+ const char* const service,
const std::string& login_token,
const std::string& login_captcha) {
+ DCHECK(!fetch_pending_) << "Tried to fetch two things at once!";
+
// This class is thread agnostic, so be sure to call this only on the
// same thread each time.
- LOG(INFO) << "Starting new ClientLogin fetch.";
+ LOG(INFO) << "Starting new ClientLogin fetch for:" << username;
// Must outlive fetcher_.
- request_body_ = GenerateRequestBody(username,
+ request_body_ = MakeClientLoginBody(username,
password,
source_,
service,
login_token,
login_captcha);
-
- fetcher_.reset(CreateClientLoginFetcher(getter_,
- request_body_,
- client_login_gurl_,
- this));
+ fetcher_.reset(CreateGaiaFetcher(getter_,
+ request_body_,
+ client_login_gurl_,
+ this));
fetch_pending_ = true;
fetcher_->Start();
}
-void GaiaAuthenticator2::OnClientLoginFetched(const std::string& data,
- const URLRequestStatus& status,
- int response_code) {
+void GaiaAuthenticator2::StartIssueAuthToken(const std::string& sid,
+ const std::string& lsid,
+ const char* const service) {
- if (status.is_success() && response_code == RC_REQUEST_OK) {
- LOG(INFO) << "ClientLogin successful!";
- std::string sid;
- std::string lsid;
- std::string token;
- ParseClientLoginResponse(data, &sid, &lsid, &token);
- consumer_->OnClientLoginSuccess(
- GaiaAuthConsumer::ClientLoginResult(sid, lsid, token, data));
- return;
- }
+ DCHECK(!fetch_pending_) << "Tried to fetch two things at once!";
+
+ LOG(INFO) << "Starting IssueAuthToken for: " << service;
+ requested_service_ = service;
+ request_body_ = MakeIssueAuthTokenBody(sid, lsid, service);
+ fetcher_.reset(CreateGaiaFetcher(getter_,
+ request_body_,
+ issue_auth_token_gurl_,
+ this));
+ fetch_pending_ = true;
+ fetcher_->Start();
+}
- GaiaAuthConsumer::ClientLoginError error;
+GaiaAuthConsumer::GaiaAuthError GaiaAuthenticator2::GenerateAuthError(
+ const std::string& data,
+ const URLRequestStatus& status) {
+
+ GaiaAuthConsumer::GaiaAuthError error;
error.data = data;
if (!status.is_success()) {
@@ -214,7 +234,39 @@ void GaiaAuthenticator2::OnClientLoginFetched(const std::string& data,
}
}
- consumer_->OnClientLoginFailure(error);
+ return error;
+}
+
+void GaiaAuthenticator2::OnClientLoginFetched(const std::string& data,
+ const URLRequestStatus& status,
+ int response_code) {
+
+ if (status.is_success() && response_code == RC_REQUEST_OK) {
+ LOG(INFO) << "ClientLogin successful!";
+ std::string sid;
+ std::string lsid;
+ std::string token;
+ ParseClientLoginResponse(data, &sid, &lsid, &token);
+ consumer_->OnClientLoginSuccess(
+ GaiaAuthConsumer::ClientLoginResult(sid, lsid, token, data));
+ return;
+ }
Zachary Kuznia 2010/07/06 03:33:23 Perhaps make this an "} else {" to make the flow o
+
+ consumer_->OnClientLoginFailure(GenerateAuthError(data, status));
+}
+
+void GaiaAuthenticator2::OnIssueAuthTokenFetched(
+ const std::string& data,
+ const URLRequestStatus& status,
+ int response_code) {
+ if (status.is_success() && response_code == RC_REQUEST_OK) {
+ // Only the bare token is returned in the body of this Gaia call
+ // without any padding.
+ consumer_->OnIssueAuthTokenSuccess(requested_service_, data);
+ } else {
+ consumer_->OnIssueAuthTokenFailure(requested_service_,
+ GenerateAuthError(data, status));
+ }
}
void GaiaAuthenticator2::OnURLFetchComplete(const URLFetcher* source,
@@ -226,9 +278,11 @@ void GaiaAuthenticator2::OnURLFetchComplete(const URLFetcher* source,
fetch_pending_ = false;
if (url == client_login_gurl_) {
OnClientLoginFetched(data, status, response_code);
- return;
+ } else if (url == issue_auth_token_gurl_) {
+ OnIssueAuthTokenFetched(data, status, response_code);
+ } else {
+ NOTREACHED();
}
- NOTREACHED();
}
// static
« no previous file with comments | « chrome/common/net/gaia/gaia_authenticator2.h ('k') | chrome/common/net/gaia/gaia_authenticator2_unittest.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698