| // Copyright 2020 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "components/security_interstitials/content/utils.h" |
| |
| #include <string> |
| |
| #include "base/command_line.h" |
| #include "base/files/file_util.h" |
| #include "base/notreached.h" |
| #include "base/process/launch.h" |
| #include "build/build_config.h" |
| #include "build/chromeos_buildflags.h" |
| |
| #if BUILDFLAG(IS_ANDROID) |
| #include "base/android/jni_android.h" |
| #include "base/android/jni_string.h" |
| #include "base/android/scoped_java_ref.h" |
| #include "components/security_interstitials/content/android/jni_headers/DateAndTimeSettingsHelper_jni.h" |
| #endif |
| |
| #if BUILDFLAG(IS_WIN) |
| #include "base/base_paths_win.h" |
| #include "base/path_service.h" |
| #endif |
| |
| namespace security_interstitials { |
| |
| #if !BUILDFLAG(IS_CHROMEOS_ASH) |
| void LaunchDateAndTimeSettings() { |
| // The code for each OS is completely separate, in order to avoid bugs like |
| // https://crbug.com/430877 . |
| #if BUILDFLAG(IS_ANDROID) |
| JNIEnv* env = base::android::AttachCurrentThread(); |
| Java_DateAndTimeSettingsHelper_openDateAndTimeSettings(env); |
| #elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) |
| struct ClockCommand { |
| const char* const pathname; |
| const char* const argument; |
| }; |
| static const ClockCommand kClockCommands[] = { |
| // Unity |
| {"/usr/bin/unity-control-center", "datetime"}, |
| // GNOME |
| // |
| // NOTE: On old Ubuntu, naming control panels doesn't work, so it |
| // opens the overview. This will have to be good enough. |
| {"/usr/bin/gnome-control-center", "datetime"}, |
| {"/usr/local/bin/gnome-control-center", "datetime"}, |
| {"/opt/bin/gnome-control-center", "datetime"}, |
| // KDE |
| {"/usr/bin/kcmshell4", "clock"}, |
| {"/usr/local/bin/kcmshell4", "clock"}, |
| {"/opt/bin/kcmshell4", "clock"}, |
| }; |
| |
| base::CommandLine command(base::FilePath("")); |
| for (const ClockCommand& cmd : kClockCommands) { |
| base::FilePath pathname(cmd.pathname); |
| if (base::PathExists(pathname)) { |
| command.SetProgram(pathname); |
| command.AppendArg(cmd.argument); |
| break; |
| } |
| } |
| if (command.GetProgram().empty()) { |
| // Alas, there is nothing we can do. |
| return; |
| } |
| |
| base::LaunchOptions options; |
| options.wait = false; |
| options.allow_new_privs = true; |
| base::LaunchProcess(command, options); |
| |
| #elif BUILDFLAG(IS_APPLE) |
| base::CommandLine command(base::FilePath("/usr/bin/open")); |
| command.AppendArg("/System/Library/PreferencePanes/DateAndTime.prefPane"); |
| |
| base::LaunchOptions options; |
| options.wait = false; |
| base::LaunchProcess(command, options); |
| |
| #elif BUILDFLAG(IS_WIN) |
| base::FilePath path; |
| base::PathService::Get(base::DIR_SYSTEM, &path); |
| static const wchar_t kControlPanelExe[] = L"control.exe"; |
| path = path.Append(std::wstring(kControlPanelExe)); |
| base::CommandLine command(path); |
| command.AppendArg(std::string("/name")); |
| command.AppendArg(std::string("Microsoft.DateAndTime")); |
| |
| base::LaunchOptions options; |
| options.wait = false; |
| base::LaunchProcess(command, options); |
| |
| #elif BUILDFLAG(IS_FUCHSIA) |
| // TODO(crbug.com/1233494): Send to the platform settings. |
| NOTIMPLEMENTED_LOG_ONCE(); |
| #else |
| #error Unsupported target architecture. |
| #endif |
| // Don't add code here! (See the comment at the beginning of the function.) |
| } |
| #endif |
| |
| } // namespace security_interstitials |