1 // Copyright 2013 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 "chrome/browser/signin/signin_promo.h"
6
7 #include "base/strings/string_number_conversions.h"
8 #include "chrome/browser/browser_process.h"
9 #include "chrome/browser/first_run/first_run.h"
10 #include "chrome/browser/google/google_brand.h"
11 #include "chrome/browser/profiles/profile.h"
12 #include "chrome/browser/signin/account_consistency_mode_manager.h"
13 #include "chrome/browser/signin/signin_promo_util.h"
14 #include "chrome/common/pref_names.h"
15 #include "chrome/common/url_constants.h"
16 #include "components/google/core/common/google_util.h"
17 #include "components/pref_registry/pref_registry_syncable.h"
18 #include "components/prefs/pref_service.h"
19 #include "content/public/browser/browser_context.h"
20 #include "content/public/browser/storage_partition_config.h"
21 #include "extensions/browser/guest_view/web_view/web_view_guest.h"
22 #include "google_apis/gaia/gaia_urls.h"
23 #include "net/base/url_util.h"
24 #include "url/gurl.h"
25
26 #if defined(OS_WIN)
27 #include "base/win/windows_version.h"
28 #endif
29
30 namespace signin {
31
32 const char kSignInPromoQueryKeyAccessPoint[] = "access_point";
33 const char kSignInPromoQueryKeyAutoClose[] = "auto_close";
34 const char kSignInPromoQueryKeyForceKeepData[] = "force_keep_data";
35 const char kSignInPromoQueryKeyReason[] = "reason";
36
37 #if !defined(OS_CHROMEOS)
GetEmbeddedPromoURL(signin_metrics::AccessPoint access_point,signin_metrics::Reason reason,bool auto_close)38 GURL GetEmbeddedPromoURL(signin_metrics::AccessPoint access_point,
39 signin_metrics::Reason reason,
40 bool auto_close) {
41 CHECK_LT(static_cast<int>(access_point),
42 static_cast<int>(signin_metrics::AccessPoint::ACCESS_POINT_MAX));
43 CHECK_NE(static_cast<int>(access_point),
44 static_cast<int>(signin_metrics::AccessPoint::ACCESS_POINT_UNKNOWN));
45 CHECK_LT(static_cast<int>(reason),
46 static_cast<int>(signin_metrics::Reason::REASON_MAX));
47 CHECK_NE(static_cast<int>(reason),
48 static_cast<int>(signin_metrics::Reason::REASON_UNKNOWN_REASON));
49
50 GURL url(chrome::kChromeUIChromeSigninURL);
51 url = net::AppendQueryParameter(
52 url, signin::kSignInPromoQueryKeyAccessPoint,
53 base::NumberToString(static_cast<int>(access_point)));
54 url =
55 net::AppendQueryParameter(url, signin::kSignInPromoQueryKeyReason,
56 base::NumberToString(static_cast<int>(reason)));
57 if (auto_close) {
58 url = net::AppendQueryParameter(url, signin::kSignInPromoQueryKeyAutoClose,
59 "1");
60 }
61 return url;
62 }
63
GetEmbeddedReauthURLWithEmail(signin_metrics::AccessPoint access_point,signin_metrics::Reason reason,const std::string & email)64 GURL GetEmbeddedReauthURLWithEmail(signin_metrics::AccessPoint access_point,
65 signin_metrics::Reason reason,
66 const std::string& email) {
67 GURL url = GetEmbeddedPromoURL(access_point, reason, /*auto_close=*/true);
68 url = net::AppendQueryParameter(url, "email", email);
69 url = net::AppendQueryParameter(url, "validateEmail", "1");
70 return net::AppendQueryParameter(url, "readOnlyEmail", "1");
71 }
72 #endif // !defined(OS_CHROMEOS)
73
GetChromeSyncURLForDice(const std::string & email,const std::string & continue_url)74 GURL GetChromeSyncURLForDice(const std::string& email,
75 const std::string& continue_url) {
76 GURL url = GaiaUrls::GetInstance()->signin_chrome_sync_dice();
77 if (!email.empty())
78 url = net::AppendQueryParameter(url, "email_hint", email);
79 if (!continue_url.empty())
80 url = net::AppendQueryParameter(url, "continue", continue_url);
81 return url;
82 }
83
GetAddAccountURLForDice(const std::string & email,const std::string & continue_url)84 GURL GetAddAccountURLForDice(const std::string& email,
85 const std::string& continue_url) {
86 GURL url = GaiaUrls::GetInstance()->add_account_url();
87 if (!email.empty())
88 url = net::AppendQueryParameter(url, "Email", email);
89 if (!continue_url.empty())
90 url = net::AppendQueryParameter(url, "continue", continue_url);
91 return url;
92 }
93
GetSigninPartition(content::BrowserContext * browser_context)94 content::StoragePartition* GetSigninPartition(
95 content::BrowserContext* browser_context) {
96 const auto signin_partition_config = content::StoragePartitionConfig::Create(
97 "chrome-signin", /* partition_name= */ "", /* in_memory= */ true);
98 return content::BrowserContext::GetStoragePartition(browser_context,
99 signin_partition_config);
100 }
101
GetAccessPointForEmbeddedPromoURL(const GURL & url)102 signin_metrics::AccessPoint GetAccessPointForEmbeddedPromoURL(const GURL& url) {
103 std::string value;
104 if (!net::GetValueForKeyInQuery(url, kSignInPromoQueryKeyAccessPoint,
105 &value)) {
106 return signin_metrics::AccessPoint::ACCESS_POINT_UNKNOWN;
107 }
108
109 int access_point = -1;
110 base::StringToInt(value, &access_point);
111 if (access_point <
112 static_cast<int>(
113 signin_metrics::AccessPoint::ACCESS_POINT_START_PAGE) ||
114 access_point >=
115 static_cast<int>(signin_metrics::AccessPoint::ACCESS_POINT_MAX)) {
116 return signin_metrics::AccessPoint::ACCESS_POINT_UNKNOWN;
117 }
118
119 return static_cast<signin_metrics::AccessPoint>(access_point);
120 }
121
GetSigninReasonForEmbeddedPromoURL(const GURL & url)122 signin_metrics::Reason GetSigninReasonForEmbeddedPromoURL(const GURL& url) {
123 std::string value;
124 if (!net::GetValueForKeyInQuery(url, kSignInPromoQueryKeyReason, &value))
125 return signin_metrics::Reason::REASON_UNKNOWN_REASON;
126
127 int reason = -1;
128 base::StringToInt(value, &reason);
129 if (reason < static_cast<int>(
130 signin_metrics::Reason::REASON_SIGNIN_PRIMARY_ACCOUNT) ||
131 reason >= static_cast<int>(signin_metrics::Reason::REASON_MAX)) {
132 return signin_metrics::Reason::REASON_UNKNOWN_REASON;
133 }
134
135 return static_cast<signin_metrics::Reason>(reason);
136 }
137
IsAutoCloseEnabledInEmbeddedURL(const GURL & url)138 bool IsAutoCloseEnabledInEmbeddedURL(const GURL& url) {
139 std::string value;
140 if (net::GetValueForKeyInQuery(url, kSignInPromoQueryKeyAutoClose, &value)) {
141 int enabled = 0;
142 if (base::StringToInt(value, &enabled) && enabled == 1)
143 return true;
144 }
145 return false;
146 }
147
RegisterProfilePrefs(user_prefs::PrefRegistrySyncable * registry)148 void RegisterProfilePrefs(
149 user_prefs::PrefRegistrySyncable* registry) {
150 registry->RegisterIntegerPref(prefs::kDiceSigninUserMenuPromoCount, 0);
151 }
152
153 } // namespace signin
154