OLD | NEW |
| (Empty) |
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/third_party/mozilla/url_parse.h" | |
11 | |
12 namespace { | |
13 | |
14 std::string GetComponent(const std::string& url, | |
15 const url::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::Parsed url_parsed; | |
57 ParseStandardURL(url.c_str(), url.length(), &url_parsed); | |
58 url::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::Component query = url_parsed.query; | |
70 url::Component key; | |
71 url::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 | |
OLD | NEW |