15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/host/setup/oauth_helper.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/stringprintf.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google_apis/google_api_keys.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/escape.h" 107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/url_parse.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string GetComponent(const std::string& url, 15010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const url::Component component) { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (component.len < 0) { 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return std::string(); 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return url.substr(component.begin, component.len); 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace remoting { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string GetOauthScope() { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "https://www.googleapis.com/auth/chromoting " 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "https://www.googleapis.com/auth/googletalk " 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "https://www.googleapis.com/auth/userinfo.email "; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string GetDefaultOauthRedirectUrl() { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "https://chromoting-oauth.talkgadget.google.com/talkgadget/oauth/" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "chrome-remote-desktop/rel/kgngmbheleoaphbjbaiobfdepmghbfah"; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string GetOauthStartUrl(const std::string& redirect_url) { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return base::StringPrintf( 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "https://accounts.google.com/o/oauth2/auth" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "?scope=%s" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "&redirect_uri=%s" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "&response_type=code" 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "&client_id=%s" 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "&access_type=offline" 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "&approval_prompt=force", 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::EscapeUrlEncodedData(GetOauthScope(), true).c_str(), 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) redirect_url.c_str(), 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::EscapeUrlEncodedData(google_apis::GetOAuth2ClientID( 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) google_apis::CLIENT_REMOTING), true).c_str()); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string GetOauthCodeInUrl(const std::string& url, 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& redirect_url) { 56010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) url::Parsed url_parsed; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ParseStandardURL(url.c_str(), url.length(), &url_parsed); 58010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) url::Parsed redirect_url_parsed; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ParseStandardURL(redirect_url.c_str(), redirect_url.length(), 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &redirect_url_parsed); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetComponent(url, url_parsed.scheme) != 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetComponent(redirect_url, redirect_url_parsed.scheme)) { 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return std::string(); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetComponent(url, url_parsed.host) != 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetComponent(redirect_url, redirect_url_parsed.host)) { 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return std::string(); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 69010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) url::Component query = url_parsed.query; 70010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) url::Component key; 71010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) url::Component value; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (ExtractQueryKeyValue(url.c_str(), &query, &key, &value)) { 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetComponent(url, key) == "code") { 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetComponent(url, value); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return std::string(); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace remoting 81