1a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// found in the LICENSE file. 4a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 5a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/signin/signin_promo.h" 6a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 7a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/prefs/pref_service.h" 8a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/strings/string_number_conversions.h" 9a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/strings/string_util.h" 10a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/strings/stringprintf.h" 11a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 12a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/browser_process.h" 13a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/first_run/first_run.h" 1446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/google/google_brand.h" 15a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 16a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/profiles/profile_info_cache.h" 17a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h" 18a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/signin/signin_manager_factory.h" 19a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/ui/webui/options/core_options_handler.h" 20a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/ui/webui/theme_source.h" 21a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/common/net/url_util.h" 22a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/common/pref_names.h" 23a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/common/url_constants.h" 246d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "components/google/core/browser/google_util.h" 25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/pref_registry/pref_registry_syncable.h" 26e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "components/signin/core/browser/signin_manager.h" 270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "components/signin/core/common/profile_management_switches.h" 28a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "content/public/browser/url_data_source.h" 29a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "content/public/browser/web_contents.h" 30a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "content/public/browser/web_ui.h" 31a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "content/public/browser/web_ui_data_source.h" 32a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "google_apis/gaia/gaia_urls.h" 33a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "grit/browser_resources.h" 34a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "grit/generated_resources.h" 35a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "grit/theme_resources.h" 36a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "net/base/escape.h" 37a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "net/base/network_change_notifier.h" 38a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "net/base/url_util.h" 39a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 40c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "url/gurl.h" 41a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 42a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)using content::WebContents; 43c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochusing net::GetValueForKeyInQuery; 44a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 45a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)namespace { 46a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 47a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Gaia cannot support about:blank as a continue URL, so using a hosted blank 48a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// page instead. 49a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)const char kSignInLandingUrlPrefix[] = 50a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) "https://www.google.com/intl/%s/chrome/blank.html"; 51a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 52a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// The maximum number of times we want to show the sign in promo at startup. 53a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)const int kSignInPromoShowAtStartupMaximum = 10; 54a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 55a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Forces the web based signin flow when set. 56a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)bool g_force_web_based_signin_flow = false; 57a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 58a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Checks we want to show the sign in promo for the given brand. 59a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)bool AllowPromoAtStartupForCurrentBrand() { 60a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::string brand; 6146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) google_brand::GetBrand(&brand); 62a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 63a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (brand.empty()) 64a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return true; 65a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 6646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (google_brand::IsInternetCafeBrandCode(brand)) 67a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return false; 68a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 69a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Enable for both organic and distribution. 70a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return true; 71a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 72a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 73a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Returns true if a user has seen the sign in promo at startup previously. 74a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)bool HasShownPromoAtStartup(Profile* profile) { 75bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch return profile->GetPrefs()->HasPrefPath(prefs::kSignInPromoStartupCount); 76a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 77a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 78a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Returns true if the user has previously skipped the sign in promo. 79a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)bool HasUserSkippedPromo(Profile* profile) { 80bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch return profile->GetPrefs()->GetBoolean(prefs::kSignInPromoUserSkipped); 81a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 82a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 83a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} // namespace 84a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 85a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)namespace signin { 86a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 87a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)bool ShouldShowPromo(Profile* profile) { 88a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#if defined(OS_CHROMEOS) 89a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // There's no need to show the sign in promo on cros since cros users are 90a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // already logged in. 91a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return false; 92a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#else 93a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 94a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Don't bother if we don't have any kind of network connection. 95a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (net::NetworkChangeNotifier::IsOffline()) 96a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return false; 97a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 98f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Don't show for supervised profiles. 99f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (profile->IsSupervised()) 100a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return false; 101a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 102a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Display the signin promo if the user is not signed in. 103a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) SigninManager* signin = SigninManagerFactory::GetForProfile( 104a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) profile->GetOriginalProfile()); 105a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return !signin->AuthInProgress() && signin->IsSigninAllowed() && 106a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) signin->GetAuthenticatedUsername().empty(); 107a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#endif 108a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 109a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 110a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)bool ShouldShowPromoAtStartup(Profile* profile, bool is_new_profile) { 111a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DCHECK(profile); 112a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 113a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Don't show if the profile is an incognito. 114a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (profile->IsOffTheRecord()) 115a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return false; 116a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 117a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (!ShouldShowPromo(profile)) 118a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return false; 119a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 120a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (!is_new_profile) { 121a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (!HasShownPromoAtStartup(profile)) 122a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return false; 123a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 124a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 125a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (HasUserSkippedPromo(profile)) 126a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return false; 127a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 128a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // For Chinese users skip the sign in promo. 129a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (g_browser_process->GetApplicationLocale() == "zh-CN") 130a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return false; 131a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 132a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PrefService* prefs = profile->GetPrefs(); 133bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch int show_count = prefs->GetInteger(prefs::kSignInPromoStartupCount); 134a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (show_count >= kSignInPromoShowAtStartupMaximum) 135a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return false; 136a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 137a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // This pref can be set in the master preferences file to allow or disallow 138a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // showing the sign in promo at startup. 139bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch if (prefs->HasPrefPath(prefs::kSignInPromoShowOnFirstRunAllowed)) 140bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch return prefs->GetBoolean(prefs::kSignInPromoShowOnFirstRunAllowed); 141a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 142a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // For now don't show the promo for some brands. 143a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (!AllowPromoAtStartupForCurrentBrand()) 144a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return false; 145a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 146a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Default to show the promo for Google Chrome builds. 147a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#if defined(GOOGLE_CHROME_BUILD) 148a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return true; 149a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#else 150a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return false; 151a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#endif 152a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 153a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 154a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void DidShowPromoAtStartup(Profile* profile) { 155a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int show_count = profile->GetPrefs()->GetInteger( 156bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch prefs::kSignInPromoStartupCount); 157a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) show_count++; 158bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch profile->GetPrefs()->SetInteger(prefs::kSignInPromoStartupCount, show_count); 159a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 160a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 161a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void SetUserSkippedPromo(Profile* profile) { 162bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch profile->GetPrefs()->SetBoolean(prefs::kSignInPromoUserSkipped, true); 163a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 164a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 165a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)GURL GetLandingURL(const char* option, int value) { 166a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const std::string& locale = g_browser_process->GetApplicationLocale(); 167a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::string url = base::StringPrintf(kSignInLandingUrlPrefix, locale.c_str()); 168a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::StringAppendF(&url, "?%s=%d", option, value); 169a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return GURL(url); 170a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 171a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 172a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)GURL GetPromoURL(Source source, bool auto_close) { 173a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return GetPromoURL(source, auto_close, false /* is_constrained */); 174a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 175a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 176a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)GURL GetPromoURL(Source source, bool auto_close, bool is_constrained) { 177c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return GetPromoURLWithContinueURL(source, auto_close, is_constrained, GURL()); 178c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 179c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 180c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochGURL GetPromoURLWithContinueURL(Source source, 181c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool auto_close, 182c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool is_constrained, 183c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch GURL continue_url) { 184a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DCHECK_NE(SOURCE_UNKNOWN, source); 185a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!switches::IsEnableWebBasedSignin()) { 187f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::string url(chrome::kChromeUIChromeSigninURL); 1888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) base::StringAppendF(&url, "?%s=%d", kSignInPromoQueryKeySource, source); 1898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (auto_close) 190a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::StringAppendF(&url, "&%s=1", kSignInPromoQueryKeyAutoClose); 191a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (is_constrained) 192a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::StringAppendF(&url, "&%s=1", kSignInPromoQueryKeyConstrained); 193c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!continue_url.is_empty()) { 194c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DCHECK(continue_url.is_valid()); 195c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch std::string escaped_continue_url = 196c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch net::EscapeQueryParamValue(continue_url.spec(), false); 197c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::StringAppendF(&url, 198c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch "&%s=%s", 199c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch kSignInPromoQueryKeyContinue, 200c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch escaped_continue_url.c_str()); 201c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 2028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return GURL(url); 2038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 2048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 205a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Build a Gaia-based URL that can be used to sign the user into chrome. 206a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // There are required request parameters: 207a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // 208a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // - tell Gaia which service the user is signing into. In this case, 209a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // a chrome sign in uses the service "chromiumsync" 210a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // - provide a continue URL. This is the URL that Gaia will redirect to 211a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // once the sign is complete. 212a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // 213a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // The continue URL includes a source parameter that can be extracted using 214a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // the function GetSourceForSignInPromoURL() below. This is used to know 215a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // which of the chrome sign in access points was used to sign the user in. 216a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // It is also parsed for the |auto_close| flag, which indicates that the tab 217a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // must be closed after sync setup is successful. 218a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // See OneClickSigninHelper for details. 219d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) std::string query_string = "?service=chromiumsync&sarp=1"; 220a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 221c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DCHECK(continue_url.is_empty()); 222c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch std::string continue_url_str = GetLandingURL(kSignInPromoQueryKeySource, 223c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch static_cast<int>(source)).spec(); 224c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (auto_close) { 225c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::StringAppendF( 226c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch &continue_url_str, "&%s=1", kSignInPromoQueryKeyAutoClose); 227c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 228a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 229c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::StringAppendF( 230c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch &query_string, 231c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch "&%s=%s", 232c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch kSignInPromoQueryKeyContinue, 233c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch net::EscapeQueryParamValue(continue_url_str, false).c_str()); 234a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 235d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return GaiaUrls::GetInstance()->service_login_url().Resolve(query_string); 236a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 237a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)GURL GetReauthURL(Profile* profile, const std::string& account_id) { 2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (switches::IsEnableWebBasedSignin()) { 2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return net::AppendQueryParameter( 2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) signin::GetPromoURL(signin::SOURCE_SETTINGS, true), 2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "Email", 2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) account_id); 2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 246cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) signin::Source source = switches::IsNewProfileManagement() ? 247cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) signin::SOURCE_REAUTH : signin::SOURCE_SETTINGS; 2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 249cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GURL url = signin::GetPromoURL( 250cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) source, true /* auto_close */, 251cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) switches::IsNewProfileManagement() /* is_constrained */); 2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) url = net::AppendQueryParameter(url, "email", account_id); 2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) url = net::AppendQueryParameter(url, "validateEmail", "1"); 2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return net::AppendQueryParameter(url, "readOnlyEmail", "1"); 2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 257a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)GURL GetNextPageURLForPromoURL(const GURL& url) { 258a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::string value; 259c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (GetValueForKeyInQuery(url, kSignInPromoQueryKeyContinue, &value)) { 260c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch GURL continue_url = GURL(value); 261c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (continue_url.is_valid()) 262c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return continue_url; 263c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 264a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 265a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return GURL(); 266a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 267a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 268a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)Source GetSourceForPromoURL(const GURL& url) { 269a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::string value; 270c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (GetValueForKeyInQuery(url, kSignInPromoQueryKeySource, &value)) { 271a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int source = 0; 272a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (base::StringToInt(value, &source) && source >= SOURCE_START_PAGE && 273a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) source < SOURCE_UNKNOWN) { 274a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return static_cast<Source>(source); 275a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 276a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 277a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return SOURCE_UNKNOWN; 278a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 279a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 280a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)bool IsAutoCloseEnabledInURL(const GURL& url) { 281a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::string value; 282c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (GetValueForKeyInQuery(url, kSignInPromoQueryKeyAutoClose, &value)) { 283a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int enabled = 0; 284a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (base::StringToInt(value, &enabled) && enabled == 1) 285a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return true; 286a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 287a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return false; 288a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 289a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 290f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)bool ShouldShowAccountManagement(const GURL& url) { 291f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::string value; 292f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (GetValueForKeyInQuery( 293f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) url, kSignInPromoQueryKeyShowAccountManagement, &value)) { 294f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int enabled = 0; 295f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (base::StringToInt(value, &enabled) && enabled == 1) 296f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return true; 297f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 298f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return false; 299f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 300f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 301a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)bool IsContinueUrlForWebBasedSigninFlow(const GURL& url) { 302a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) GURL::Replacements replacements; 303a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) replacements.ClearQuery(); 304a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const std::string& locale = g_browser_process->GetApplicationLocale(); 3055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL continue_url = 306a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) GURL(base::StringPrintf(kSignInLandingUrlPrefix, locale.c_str())); 3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return ( 3085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) google_util::IsGoogleDomainUrl( 3095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) url, 3105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) google_util::ALLOW_SUBDOMAIN, 3115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) google_util::DISALLOW_NON_STANDARD_PORTS) && 3125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) url.ReplaceComponents(replacements).path() == 3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) continue_url.ReplaceComponents(replacements).path()); 314a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 315a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 316a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void ForceWebBasedSigninFlowForTesting(bool force) { 317a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) g_force_web_based_signin_flow = force; 318a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 319a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 320a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void RegisterProfilePrefs( 321a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) user_prefs::PrefRegistrySyncable* registry) { 322a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) registry->RegisterIntegerPref( 323bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch prefs::kSignInPromoStartupCount, 324a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 0, 325a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 326a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) registry->RegisterBooleanPref( 327bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch prefs::kSignInPromoUserSkipped, 328a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) false, 329a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 330a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) registry->RegisterBooleanPref( 331bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch prefs::kSignInPromoShowOnFirstRunAllowed, 332a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) true, 333a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 334a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) registry->RegisterBooleanPref( 335bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch prefs::kSignInPromoShowNTPBubble, 336a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) false, 337a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 338a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 339a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 340a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} // namespace signin 341