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