Home | History | Annotate | Download | only in setup
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "remoting/host/setup/oauth_helper.h"
      6 
      7 #include "base/strings/stringprintf.h"
      8 #include "google_apis/google_api_keys.h"
      9 #include "net/base/escape.h"
     10 #include "url/url_parse.h"
     11 
     12 namespace {
     13 
     14 std::string GetComponent(const std::string& url,
     15                          const url_parse::Component component) {
     16   if (component.len < 0) {
     17     return std::string();
     18   }
     19   return url.substr(component.begin, component.len);
     20 }
     21 
     22 }  // namespace
     23 
     24 namespace remoting {
     25 
     26 std::string GetOauthScope() {
     27   return
     28       "https://www.googleapis.com/auth/chromoting "
     29       "https://www.googleapis.com/auth/googletalk "
     30       "https://www.googleapis.com/auth/userinfo.email ";
     31 }
     32 
     33 std::string GetDefaultOauthRedirectUrl() {
     34   return
     35       "https://chromoting-oauth.talkgadget.google.com/talkgadget/oauth/"
     36       "chrome-remote-desktop/rel/kgngmbheleoaphbjbaiobfdepmghbfah";
     37 }
     38 
     39 std::string GetOauthStartUrl(const std::string& redirect_url) {
     40   return base::StringPrintf(
     41       "https://accounts.google.com/o/oauth2/auth"
     42       "?scope=%s"
     43       "&redirect_uri=%s"
     44       "&response_type=code"
     45       "&client_id=%s"
     46       "&access_type=offline"
     47       "&approval_prompt=force",
     48       net::EscapeUrlEncodedData(GetOauthScope(), true).c_str(),
     49       redirect_url.c_str(),
     50       net::EscapeUrlEncodedData(google_apis::GetOAuth2ClientID(
     51           google_apis::CLIENT_REMOTING), true).c_str());
     52 }
     53 
     54 std::string GetOauthCodeInUrl(const std::string& url,
     55                               const std::string& redirect_url) {
     56   url_parse::Parsed url_parsed;
     57   ParseStandardURL(url.c_str(), url.length(), &url_parsed);
     58   url_parse::Parsed redirect_url_parsed;
     59   ParseStandardURL(redirect_url.c_str(), redirect_url.length(),
     60                    &redirect_url_parsed);
     61   if (GetComponent(url, url_parsed.scheme) !=
     62       GetComponent(redirect_url, redirect_url_parsed.scheme)) {
     63     return std::string();
     64   }
     65   if (GetComponent(url, url_parsed.host) !=
     66       GetComponent(redirect_url, redirect_url_parsed.host)) {
     67     return std::string();
     68   }
     69   url_parse::Component query = url_parsed.query;
     70   url_parse::Component key;
     71   url_parse::Component value;
     72   while (ExtractQueryKeyValue(url.c_str(), &query, &key, &value)) {
     73     if (GetComponent(url, key) == "code") {
     74       return GetComponent(url, value);
     75     }
     76   }
     77   return std::string();
     78 }
     79 
     80 }  // namespace remoting
     81