// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "remoting/host/setup/oauth_helper.h"
#include "base/strings/stringprintf.h"
#include "google_apis/google_api_keys.h"
#include "net/base/escape.h"
#include "url/url_parse.h"
namespace {
std::string GetComponent(const std::string& url,
const url::Component component) {
if (component.len < 0) {
return std::string();
}
return url.substr(component.begin, component.len);
}
} // namespace
namespace remoting {
std::string GetOauthScope() {
return
"https://www.googleapis.com/auth/chromoting "
"https://www.googleapis.com/auth/googletalk "
"https://www.googleapis.com/auth/userinfo.email ";
}
std::string GetDefaultOauthRedirectUrl() {
return
"https://chromoting-oauth.talkgadget.google.com/talkgadget/oauth/"
"chrome-remote-desktop/rel/kgngmbheleoaphbjbaiobfdepmghbfah";
}
std::string GetOauthStartUrl(const std::string& redirect_url) {
return base::StringPrintf(
"https://accounts.google.com/o/oauth2/auth"
"?scope=%s"
"&redirect_uri=%s"
"&response_type=code"
"&client_id=%s"
"&access_type=offline"
"&approval_prompt=force",
net::EscapeUrlEncodedData(GetOauthScope(), true).c_str(),
redirect_url.c_str(),
net::EscapeUrlEncodedData(google_apis::GetOAuth2ClientID(
google_apis::CLIENT_REMOTING), true).c_str());
}
std::string GetOauthCodeInUrl(const std::string& url,
const std::string& redirect_url) {
url::Parsed url_parsed;
ParseStandardURL(url.c_str(), url.length(), &url_parsed);
url::Parsed redirect_url_parsed;
ParseStandardURL(redirect_url.c_str(), redirect_url.length(),
&redirect_url_parsed);
if (GetComponent(url, url_parsed.scheme) !=
GetComponent(redirect_url, redirect_url_parsed.scheme)) {
return std::string();
}
if (GetComponent(url, url_parsed.host) !=
GetComponent(redirect_url, redirect_url_parsed.host)) {
return std::string();
}
url::Component query = url_parsed.query;
url::Component key;
url::Component value;
while (ExtractQueryKeyValue(url.c_str(), &query, &key, &value)) {
if (GetComponent(url, key) == "code") {
return GetComponent(url, value);
}
}
return std::string();
}
} // namespace remoting