|  | // Copyright 2020 The Chromium Authors | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include "content/browser/utility_sandbox_delegate.h" | 
|  |  | 
|  | #include "base/check.h" | 
|  | #include "build/build_config.h" | 
|  | #include "build/chromeos_buildflags.h" | 
|  | #include "components/services/screen_ai/buildflags/buildflags.h" | 
|  | #include "content/public/common/sandboxed_process_launcher_delegate.h" | 
|  | #include "content/public/common/zygote/zygote_buildflags.h" | 
|  | #include "ppapi/buildflags/buildflags.h" | 
|  | #include "printing/buildflags/buildflags.h" | 
|  | #include "sandbox/policy/mojom/sandbox.mojom.h" | 
|  |  | 
|  | #if BUILDFLAG(USE_ZYGOTE_HANDLE) | 
|  | #include "content/common/zygote/zygote_handle_impl_linux.h" | 
|  | #include "sandbox/policy/sandbox_type.h" | 
|  | #endif | 
|  |  | 
|  | #if BUILDFLAG(IS_CHROMEOS_ASH) | 
|  | #include "chromeos/ash/components/assistant/buildflags.h" | 
|  | #endif  // BUILDFLAG(IS_CHROMEOS_ASH) | 
|  |  | 
|  | namespace content { | 
|  |  | 
|  | UtilitySandboxedProcessLauncherDelegate:: | 
|  | UtilitySandboxedProcessLauncherDelegate( | 
|  | sandbox::mojom::Sandbox sandbox_type, | 
|  | const base::EnvironmentMap& env, | 
|  | const base::CommandLine& cmd_line) | 
|  | : | 
|  | #if BUILDFLAG(IS_POSIX) | 
|  | env_(env), | 
|  | #endif | 
|  | sandbox_type_(sandbox_type), | 
|  | cmd_line_(cmd_line) { | 
|  | #if DCHECK_IS_ON() | 
|  | bool supported_sandbox_type = | 
|  | sandbox_type_ == sandbox::mojom::Sandbox::kNoSandbox || | 
|  | #if BUILDFLAG(IS_WIN) | 
|  | sandbox_type_ == | 
|  | sandbox::mojom::Sandbox::kNoSandboxAndElevatedPrivileges || | 
|  | sandbox_type_ == sandbox::mojom::Sandbox::kXrCompositing || | 
|  | sandbox_type_ == sandbox::mojom::Sandbox::kPdfConversion || | 
|  | sandbox_type_ == sandbox::mojom::Sandbox::kIconReader || | 
|  | sandbox_type_ == sandbox::mojom::Sandbox::kMediaFoundationCdm || | 
|  | sandbox_type_ == sandbox::mojom::Sandbox::kWindowsSystemProxyResolver || | 
|  | #endif | 
|  | #if BUILDFLAG(IS_MAC) | 
|  | sandbox_type_ == sandbox::mojom::Sandbox::kMirroring || | 
|  | #endif | 
|  | sandbox_type_ == sandbox::mojom::Sandbox::kUtility || | 
|  | sandbox_type_ == sandbox::mojom::Sandbox::kService || | 
|  | sandbox_type_ == sandbox::mojom::Sandbox::kServiceWithJit || | 
|  | sandbox_type_ == sandbox::mojom::Sandbox::kNetwork || | 
|  | sandbox_type_ == sandbox::mojom::Sandbox::kCdm || | 
|  | #if BUILDFLAG(ENABLE_OOP_PRINTING) | 
|  | sandbox_type_ == sandbox::mojom::Sandbox::kPrintBackend || | 
|  | #endif | 
|  | sandbox_type_ == sandbox::mojom::Sandbox::kPrintCompositor || | 
|  | #if BUILDFLAG(ENABLE_PPAPI) | 
|  | sandbox_type_ == sandbox::mojom::Sandbox::kPpapi || | 
|  | #endif | 
|  | #if BUILDFLAG(IS_FUCHSIA) | 
|  | sandbox_type_ == sandbox::mojom::Sandbox::kVideoCapture || | 
|  | #endif | 
|  | #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH) | 
|  | sandbox_type_ == sandbox::mojom::Sandbox::kHardwareVideoDecoding || | 
|  | #endif  // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH) | 
|  | #if BUILDFLAG(IS_CHROMEOS_ASH) | 
|  | sandbox_type_ == sandbox::mojom::Sandbox::kIme || | 
|  | sandbox_type_ == sandbox::mojom::Sandbox::kTts || | 
|  | #if BUILDFLAG(ENABLE_CROS_LIBASSISTANT) | 
|  | sandbox_type_ == sandbox::mojom::Sandbox::kLibassistant || | 
|  | #endif  // BUILDFLAG(ENABLE_CROS_LIBASSISTANT) | 
|  | #endif  // BUILDFLAG(IS_CHROMEOS_ASH) | 
|  | #if BUILDFLAG(ENABLE_SCREEN_AI_SERVICE) | 
|  | sandbox_type_ == sandbox::mojom::Sandbox::kScreenAI || | 
|  | #endif | 
|  | sandbox_type_ == sandbox::mojom::Sandbox::kAudio || | 
|  | sandbox_type_ == sandbox::mojom::Sandbox::kSpeechRecognition; | 
|  | DCHECK(supported_sandbox_type); | 
|  | #endif  // DCHECK_IS_ON() | 
|  | } | 
|  |  | 
|  | UtilitySandboxedProcessLauncherDelegate:: | 
|  | ~UtilitySandboxedProcessLauncherDelegate() {} | 
|  |  | 
|  | sandbox::mojom::Sandbox | 
|  | UtilitySandboxedProcessLauncherDelegate::GetSandboxType() { | 
|  | return sandbox_type_; | 
|  | } | 
|  |  | 
|  | #if BUILDFLAG(IS_POSIX) | 
|  | base::EnvironmentMap UtilitySandboxedProcessLauncherDelegate::GetEnvironment() { | 
|  | return env_; | 
|  | } | 
|  | #endif  // BUILDFLAG(IS_POSIX) | 
|  |  | 
|  | #if BUILDFLAG(USE_ZYGOTE_HANDLE) | 
|  | ZygoteHandle UtilitySandboxedProcessLauncherDelegate::GetZygote() { | 
|  | // If the sandbox has been disabled for a given type, don't use a zygote. | 
|  | if (sandbox::policy::IsUnsandboxedSandboxType(sandbox_type_)) | 
|  | return nullptr; | 
|  |  | 
|  | // Utility processes which need specialized sandboxes fork from the | 
|  | // unsandboxed zygote and then apply their actual sandboxes in the forked | 
|  | // process upon startup. | 
|  | if (sandbox_type_ == sandbox::mojom::Sandbox::kNetwork || | 
|  | #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH) | 
|  | sandbox_type_ == sandbox::mojom::Sandbox::kHardwareVideoDecoding || | 
|  | #endif  // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH) | 
|  | #if BUILDFLAG(IS_CHROMEOS_ASH) | 
|  | sandbox_type_ == sandbox::mojom::Sandbox::kIme || | 
|  | sandbox_type_ == sandbox::mojom::Sandbox::kTts || | 
|  | #if BUILDFLAG(ENABLE_CROS_LIBASSISTANT) | 
|  | sandbox_type_ == sandbox::mojom::Sandbox::kLibassistant || | 
|  | #endif  // BUILDFLAG(ENABLE_CROS_LIBASSISTANT) | 
|  | #endif  // BUILDFLAG(IS_CHROMEOS_ASH) | 
|  | sandbox_type_ == sandbox::mojom::Sandbox::kAudio || | 
|  | #if BUILDFLAG(ENABLE_OOP_PRINTING) | 
|  | sandbox_type_ == sandbox::mojom::Sandbox::kPrintBackend || | 
|  | #endif | 
|  | #if BUILDFLAG(ENABLE_SCREEN_AI_SERVICE) | 
|  | sandbox_type_ == sandbox::mojom::Sandbox::kScreenAI || | 
|  | #endif | 
|  | sandbox_type_ == sandbox::mojom::Sandbox::kSpeechRecognition) { | 
|  | return GetUnsandboxedZygote(); | 
|  | } | 
|  |  | 
|  | // All other types use the pre-sandboxed zygote. | 
|  | return GetGenericZygote(); | 
|  | } | 
|  | #endif  // BUILDFLAG(USE_ZYGOTE_HANDLE) | 
|  |  | 
|  | }  // namespace content |