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 "chrome/browser/ui/startup/bad_flags_prompt.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/files/file_path.h" 9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/infobars/infobar_service.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/infobars/simple_alert_infobar_delegate.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h" 13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/ui/simple_message_box.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h" 15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/common/chrome_paths.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h" 17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/common/switch_utils.h" 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/grit/chromium_strings.h" 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/grit/generated_resources.h" 20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/invalidation/invalidation_switches.h" 21a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "components/nacl/common/nacl_switches.h" 22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/startup_metric_utils/startup_metric_utils.h" 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/translate/core/common/translate_switches.h" 24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/public/common/content_switches.h" 25ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "extensions/common/switches.h" 26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "google_apis/gaia/gaia_switches.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chrome { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShowBadFlagsPrompt(Browser* browser) { 337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch content::WebContents* web_contents = 347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch browser->tab_strip_model()->GetActiveWebContents(); 357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!web_contents) 367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return; 377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Unsupported flags for which to display a warning that "stability and 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // security will suffer". 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char* kBadFlags[] = { 41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // These flags disable sandbox-related security. 42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) switches::kDisableGpuSandbox, 43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) switches::kDisableSeccompFilterSandbox, 44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) switches::kDisableSetuidSandbox, 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kDisableWebSecurity, 46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if !defined(DISABLE_NACL) 47a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch switches::kNaClDangerousNoSandboxNonSfi, 48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif 49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) switches::kNoSandbox, 50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) switches::kSingleProcess, 51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // These flags disable or undermine the Same Origin Policy. 53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) switches::kTrustedSpdyProxy, 544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) translate::switches::kTranslateSecurityOrigin, 55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // These flags undermine HTTPS / connection security. 57effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#if defined(ENABLE_WEBRTC) 580f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) switches::kDisableWebRtcEncryption, 59effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif 60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) switches::kIgnoreCertificateErrors, 61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) switches::kReduceSecurityForTesting, 62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) invalidation::switches::kSyncAllowInsecureXmppConnection, 63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // These flags change the URLs that handle PII. 65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) autofill::switches::kWalletSecureServiceUrl, 66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) switches::kGaiaUrl, 67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) translate::switches::kTranslateScriptURL, 68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // This flag gives extensions more powers. 70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) extensions::switches::kExtensionsOnChromeURLs, 71effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 72effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#if defined(OS_LINUX) && !defined(OS_CHROMEOS) 73effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Speech dispatcher is buggy, it can crash and it can make Chrome freeze. 74effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // http://crbug.com/327295 75effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch switches::kEnableSpeechDispatcher, 76effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (const char** flag = kBadFlags; *flag; ++flag) { 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch(*flag)) { 827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SimpleAlertInfoBarDelegate::Create( 837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch InfoBarService::FromWebContents(web_contents), 840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch infobars::InfoBarDelegate::kNoIconID, 857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch l10n_util::GetStringFUTF16(IDS_BAD_FLAGS_WARNING_MESSAGE, 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UTF8ToUTF16( 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string("--") + *flag)), 887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch false); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void MaybeShowInvalidUserDataDirWarningDialog() { 95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::FilePath& user_data_dir = GetInvalidSpecifiedUserDataDir(); 96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (user_data_dir.empty()) 97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) startup_metric_utils::SetNonBrowserUIDisplayed(); 100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Ensure the ResourceBundle is initialized for string resource access. 102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool cleanup_resource_bundle = false; 103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!ResourceBundle::HasSharedInstance()) { 104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) cleanup_resource_bundle = true; 105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::string locale = l10n_util::GetApplicationLocale(std::string()); 106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const char kUserDataDirDialogFallbackLocale[] = "en-US"; 107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (locale.empty()) 108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) locale = kUserDataDirDialogFallbackLocale; 1096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ui::ResourceBundle::InitSharedInstanceWithLocale( 1106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) locale, NULL, ui::ResourceBundle::LOAD_COMMON_RESOURCES); 111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::string16& title = 114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) l10n_util::GetStringUTF16(IDS_CANT_WRITE_USER_DIRECTORY_TITLE); 115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::string16& message = 116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) l10n_util::GetStringFUTF16(IDS_CANT_WRITE_USER_DIRECTORY_SUMMARY, 117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) user_data_dir.LossyDisplayName()); 118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (cleanup_resource_bundle) 120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ResourceBundle::CleanupSharedInstance(); 121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // More complex dialogs cannot be shown before the earliest calls here. 123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ShowMessageBox(NULL, title, message, chrome::MESSAGE_BOX_TYPE_WARNING); 124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 125a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace chrome 127