blob: c287faefbd7b1628336ef24f2281cf8007a9fca5 [file] [log] [blame]
// 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/browser/component_updater/mei_preload_component_installer.h"
#include <memory>
#include <string>
#include <utility>
#include <vector>
#include "base/check.h"
#include "base/files/file_path.h"
#include "base/files/file_util.h"
#include "base/functional/bind.h"
#include "base/memory/ref_counted.h"
#include "base/path_service.h"
#include "base/task/task_traits.h"
#include "base/task/thread_pool.h"
#include "base/values.h"
#include "base/version.h"
#include "chrome/browser/media/media_engagement_preloaded_list.h"
#include "components/component_updater/component_updater_paths.h"
#include "media/base/media_switches.h"
using component_updater::ComponentUpdateService;
namespace {
constexpr base::FilePath::CharType kMediaEngagementPreloadBinaryPbFileName[] =
FILE_PATH_LITERAL("preloaded_data.pb");
// The extension id is: laoigpblnllgcgjnjnllmfolckpjlhki
constexpr uint8_t kMeiPreloadPublicKeySHA256[32] = {
0xb0, 0xe8, 0x6f, 0x1b, 0xdb, 0xb6, 0x26, 0x9d, 0x9d, 0xbb, 0xc5,
0xeb, 0x2a, 0xf9, 0xb7, 0xa8, 0x50, 0x35, 0x43, 0x88, 0xc2, 0x09,
0x04, 0x02, 0xc1, 0xfb, 0x3a, 0xca, 0x7b, 0x11, 0xf9, 0xa9};
constexpr char kMediaEngagementPreloadManifestName[] = "MEI Preload";
void LoadPreloadedDataFromDisk(const base::FilePath& pb_path) {
DCHECK(!pb_path.empty());
MediaEngagementPreloadedList::GetInstance()->LoadFromFile(pb_path);
}
} // namespace
namespace component_updater {
MediaEngagementPreloadComponentInstallerPolicy::
MediaEngagementPreloadComponentInstallerPolicy(
base::OnceClosure on_load_closure)
: on_load_closure_(std::move(on_load_closure)) {}
MediaEngagementPreloadComponentInstallerPolicy::
~MediaEngagementPreloadComponentInstallerPolicy() = default;
bool MediaEngagementPreloadComponentInstallerPolicy::
SupportsGroupPolicyEnabledComponentUpdates() const {
return true;
}
bool MediaEngagementPreloadComponentInstallerPolicy::RequiresNetworkEncryption()
const {
return false;
}
update_client::CrxInstaller::Result
MediaEngagementPreloadComponentInstallerPolicy::OnCustomInstall(
const base::Value::Dict& manifest,
const base::FilePath& install_dir) {
return update_client::CrxInstaller::Result(0); // Nothing custom here.
}
void MediaEngagementPreloadComponentInstallerPolicy::OnCustomUninstall() {}
base::FilePath MediaEngagementPreloadComponentInstallerPolicy::GetInstalledPath(
const base::FilePath& base) {
return base.Append(kMediaEngagementPreloadBinaryPbFileName);
}
void MediaEngagementPreloadComponentInstallerPolicy::ComponentReady(
const base::Version& version,
const base::FilePath& install_dir,
base::Value::Dict manifest) {
constexpr base::TaskTraits kTaskTraits = {
base::MayBlock(), base::TaskPriority::BEST_EFFORT,
base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN};
base::OnceClosure task =
base::BindOnce(&LoadPreloadedDataFromDisk, GetInstalledPath(install_dir));
if (!on_load_closure_) {
base::ThreadPool::PostTask(FROM_HERE, kTaskTraits, std::move(task));
} else {
base::ThreadPool::PostTaskAndReply(FROM_HERE, kTaskTraits, std::move(task),
std::move(on_load_closure_));
}
}
// Called during startup and installation before ComponentReady().
bool MediaEngagementPreloadComponentInstallerPolicy::VerifyInstallation(
const base::Value::Dict& manifest,
const base::FilePath& install_dir) const {
// No need to actually validate the proto here, since we'll do the checking
// in LoadFromFile().
return base::PathExists(GetInstalledPath(install_dir));
}
base::FilePath
MediaEngagementPreloadComponentInstallerPolicy::GetRelativeInstallDir() const {
return base::FilePath(FILE_PATH_LITERAL("MEIPreload"));
}
void MediaEngagementPreloadComponentInstallerPolicy::GetHash(
std::vector<uint8_t>* hash) const {
hash->assign(
kMeiPreloadPublicKeySHA256,
kMeiPreloadPublicKeySHA256 + std::size(kMeiPreloadPublicKeySHA256));
}
std::string MediaEngagementPreloadComponentInstallerPolicy::GetName() const {
return kMediaEngagementPreloadManifestName;
}
update_client::InstallerAttributes
MediaEngagementPreloadComponentInstallerPolicy::GetInstallerAttributes() const {
return update_client::InstallerAttributes();
}
void RegisterMediaEngagementPreloadComponent(ComponentUpdateService* cus,
base::OnceClosure on_load) {
if (!base::FeatureList::IsEnabled(media::kPreloadMediaEngagementData))
return;
auto installer = base::MakeRefCounted<ComponentInstaller>(
std::make_unique<MediaEngagementPreloadComponentInstallerPolicy>(
std::move(on_load)));
installer->Register(cus, base::OnceClosure());
}
} // namespace component_updater