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