chromium/chrome/common/media/cdm_host_file_path.cc

// 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/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_IN_MIGRATION();

  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)