Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / google_apis / gaia / gaia_oauth_client.cc
index 1113ff6..1d5f9eb 100644 (file)
@@ -56,6 +56,9 @@ class GaiaOAuthClient::Core
   void GetUserId(const std::string& oauth_access_token,
                  int max_retries,
                  Delegate* delegate);
+  void GetUserInfo(const std::string& oauth_access_token,
+                   int max_retries,
+                   Delegate* delegate);
   void GetTokenInfo(const std::string& oauth_access_token,
                     int max_retries,
                     Delegate* delegate);
@@ -73,13 +76,14 @@ class GaiaOAuthClient::Core
     TOKEN_INFO,
     USER_EMAIL,
     USER_ID,
+    USER_INFO,
   };
 
   virtual ~Core() {}
 
-  void GetUserInfo(const std::string& oauth_access_token,
-                   int max_retries,
-                   Delegate* delegate);
+  void PeopleGet(const std::string& oauth_access_token,
+                 int max_retries,
+                 Delegate* delegate);
   void MakeGaiaRequest(const GURL& url,
                        const std::string& post_body,
                        int max_retries,
@@ -145,7 +149,7 @@ void GaiaOAuthClient::Core::GetUserEmail(const std::string& oauth_access_token,
   DCHECK_EQ(request_type_, NO_PENDING_REQUEST);
   DCHECK(!request_.get());
   request_type_ = USER_EMAIL;
-  GetUserInfo(oauth_access_token, max_retries, delegate);
+  PeopleGet(oauth_access_token, max_retries, delegate);
 }
 
 void GaiaOAuthClient::Core::GetUserId(const std::string& oauth_access_token,
@@ -154,16 +158,25 @@ void GaiaOAuthClient::Core::GetUserId(const std::string& oauth_access_token,
   DCHECK_EQ(request_type_, NO_PENDING_REQUEST);
   DCHECK(!request_.get());
   request_type_ = USER_ID;
-  GetUserInfo(oauth_access_token, max_retries, delegate);
+  PeopleGet(oauth_access_token, max_retries, delegate);
 }
 
 void GaiaOAuthClient::Core::GetUserInfo(const std::string& oauth_access_token,
                                         int max_retries,
                                         Delegate* delegate) {
+  DCHECK_EQ(request_type_, NO_PENDING_REQUEST);
+  DCHECK(!request_.get());
+  request_type_ = USER_INFO;
+  PeopleGet(oauth_access_token, max_retries, delegate);
+}
+
+void GaiaOAuthClient::Core::PeopleGet(const std::string& oauth_access_token,
+                                      int max_retries,
+                                      Delegate* delegate) {
   delegate_ = delegate;
   num_retries_ = 0;
   request_.reset(net::URLFetcher::Create(
-      kUrlFetcherId, GURL(GaiaUrls::GetInstance()->oauth_user_info_url()),
+      kUrlFetcherId, GURL(GaiaUrls::GetInstance()->people_get_url()),
       net::URLFetcher::GET, this));
   request_->SetRequestContext(request_context_getter_.get());
   request_->AddExtraRequestHeader("Authorization: OAuth " + oauth_access_token);
@@ -282,9 +295,27 @@ void GaiaOAuthClient::Core::HandleResponse(
 
   switch (type) {
     case USER_EMAIL: {
-      std::string email;
-      response_dict->GetString("email", &email);
-      delegate_->OnGetUserEmailResponse(email);
+      // Use first email of type "account" as the user's email.
+      const base::ListValue* emails_list;
+      bool email_found = false;
+      if (response_dict->GetList("emails", &emails_list)) {
+        for (size_t i = 0; i < emails_list->GetSize(); ++i) {
+          const base::DictionaryValue* email_dict;
+          if (emails_list->GetDictionary(i, &email_dict)) {
+            std::string email;
+            std::string type;
+            if (email_dict->GetString("type", &type) &&
+                type == "account" &&
+                email_dict->GetString("value", &email)) {
+              delegate_->OnGetUserEmailResponse(email);
+              email_found = true;
+              break;
+            }
+          }
+        }
+      }
+      if (!email_found)
+        delegate_->OnNetworkError(net::URLFetcher::RESPONSE_CODE_INVALID);
       break;
     }
 
@@ -295,6 +326,11 @@ void GaiaOAuthClient::Core::HandleResponse(
       break;
     }
 
+    case USER_INFO: {
+      delegate_->OnGetUserInfoResponse(response_dict.Pass());
+      break;
+    }
+
     case TOKEN_INFO: {
       delegate_->OnGetTokenInfoResponse(response_dict.Pass());
       break;
@@ -372,6 +408,12 @@ void GaiaOAuthClient::GetUserId(const std::string& access_token,
   return core_->GetUserId(access_token, max_retries, delegate);
 }
 
+void GaiaOAuthClient::GetUserInfo(const std::string& access_token,
+                                  int max_retries,
+                                  Delegate* delegate) {
+  return core_->GetUserInfo(access_token, max_retries, delegate);
+}
+
 void GaiaOAuthClient::GetTokenInfo(const std::string& access_token,
                                    int max_retries,
                                    Delegate* delegate) {