| // Copyright 2017 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/common/media/cdm_host_file_path.h" |
| |
| #include "base/check.h" |
| #include "base/files/file_path.h" |
| #include "base/files/file_util.h" |
| #include "base/logging.h" |
| #include "base/notimplemented.h" |
| #include "base/notreached.h" |
| #include "base/path_service.h" |
| #include "build/branding_buildflags.h" |
| #include "build/build_config.h" |
| #include "chrome/common/chrome_constants.h" |
| #include "chrome/common/chrome_version.h" |
| |
| #if BUILDFLAG(IS_MAC) |
| #include "base/apple/bundle_locations.h" |
| #endif |
| |
| #if BUILDFLAG(GOOGLE_CHROME_BRANDING) |
| |
| namespace { |
| |
| // TODO(xhwang): Move this to a common place if needed. |
| const base::FilePath::CharType kSignatureFileExtension[] = |
| FILE_PATH_LITERAL(".sig"); |
| |
| // Returns the signature file path given the |file_path|. This function should |
| // only be used when the signature file and the file are located in the same |
| // directory. |
| base::FilePath GetSigFilePath(const base::FilePath& file_path) { |
| return file_path.AddExtension(kSignatureFileExtension); |
| } |
| |
| } // namespace |
| |
| void AddCdmHostFilePaths( |
| std::vector<media::CdmHostFilePath>* cdm_host_file_paths) { |
| DVLOG(1) << __func__; |
| DCHECK(cdm_host_file_paths); |
| DCHECK(cdm_host_file_paths->empty()); |
| |
| #if BUILDFLAG(IS_WIN) |
| |
| // Find where kBrowserProcessExecutableName is installed. Signature file is |
| // in the assets directory. FILE_EXE may not be kBrowserProcessExecutableName, |
| // e.g. browser_tests.exe, which is fine since we don't verify those |
| // signatures in tests. |
| base::FilePath dir_exe; |
| CHECK(base::PathService::Get(base::DIR_EXE, &dir_exe)); |
| base::FilePath chrome_exe = |
| dir_exe.Append(chrome::kBrowserProcessExecutableName); |
| |
| // Signature files and kBrowserResourcesDll are typically in a |
| // separate versioned directory, but may be the same directory as |
| // kBrowserProcessExecutableName (e.g. for a local build of Chrome). |
| // DIR_ASSETS sorts this out for us. |
| base::FilePath chrome_assets_dir; |
| CHECK(base::PathService::Get(base::DIR_ASSETS, &chrome_assets_dir)); |
| const auto chrome_exe_sig = GetSigFilePath( |
| chrome_assets_dir.Append(chrome::kBrowserProcessExecutableName)); |
| DVLOG(2) << __func__ << ":" << chrome_exe.value() << ", signature file " |
| << chrome_exe_sig.value(); |
| cdm_host_file_paths->emplace_back(chrome_exe, chrome_exe_sig); |
| |
| // kBrowserResourcesDll and it's signature file are in the assets directory. |
| const auto chrome_dll = |
| chrome_assets_dir.Append(chrome::kBrowserResourcesDll); |
| const auto chrome_dll_sig = GetSigFilePath(chrome_dll); |
| DVLOG(2) << __func__ << ":" << chrome_dll.value() << ", signature file " |
| << chrome_dll_sig.value(); |
| cdm_host_file_paths->emplace_back(chrome_dll, chrome_dll_sig); |
| |
| #elif BUILDFLAG(IS_MAC) |
| |
| base::FilePath framework_dir = base::apple::FrameworkBundlePath(); |
| base::FilePath chrome_framework_path = |
| framework_dir.Append(chrome::kFrameworkExecutableName); |
| // The signature file lives inside |
| // Google Chrome Framework.framework/Versions/X/Resources/. |
| base::FilePath widevine_signature_path = framework_dir.Append("Resources"); |
| base::FilePath chrome_framework_sig_path = GetSigFilePath( |
| widevine_signature_path.Append(chrome::kFrameworkExecutableName)); |
| |
| DVLOG(2) << __func__ |
| << ": chrome_framework_path=" << chrome_framework_path.value() |
| << ", signature_path=" << chrome_framework_sig_path.value(); |
| cdm_host_file_paths->emplace_back(chrome_framework_path, |
| chrome_framework_sig_path); |
| |
| #elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) |
| |
| base::FilePath chrome_exe_dir; |
| if (!base::PathService::Get(base::DIR_EXE, &chrome_exe_dir)) { |
| NOTREACHED(); |
| } |
| |
| base::FilePath chrome_path = |
| chrome_exe_dir.Append(FILE_PATH_LITERAL("chrome")); |
| DVLOG(2) << __func__ << ": chrome_path=" << chrome_path.value(); |
| cdm_host_file_paths->emplace_back(chrome_path, GetSigFilePath(chrome_path)); |
| |
| #endif // BUILDFLAG(IS_WIN) |
| } |
| |
| #else // BUILDFLAG(GOOGLE_CHROME_BRANDING) |
| |
| void AddCdmHostFilePaths( |
| std::vector<media::CdmHostFilePath>* cdm_host_file_paths) { |
| NOTIMPLEMENTED() << "CDM host file paths need to be provided for the CDM to " |
| "verify the host."; |
| } |
| |
| #endif // BUILDFLAG(GOOGLE_CHROME_BRANDING) |