// 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/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)
