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