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