blob: c196676c4e8f8e6c17c2fa0029b6abf16fbb5807 [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// 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/bind.h"
#include "base/files/file_path.h"
#include "base/files/file_util.h"
#include "base/logging.h"
#include "base/memory/ref_counted.h"
#include "base/path_service.h"
#include "base/stl_util.h"
#include "base/task/post_task.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: aemomkdncapdnfajjbbcbdebjljbpmpj
constexpr uint8_t kMeiPreloadPublicKeySHA256[32] = {
0x04, 0xce, 0xca, 0x3d, 0x20, 0xf3, 0xd5, 0x09, 0x91, 0x12, 0x13,
0x41, 0x9b, 0x91, 0xfc, 0xf9, 0x19, 0xc4, 0x94, 0x6a, 0xb9, 0x9a,
0xe1, 0xaf, 0x3b, 0x9a, 0x95, 0x85, 0x5b, 0x9e, 0x99, 0xed};
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 false;
}
bool MediaEngagementPreloadComponentInstallerPolicy::RequiresNetworkEncryption()
const {
return false;
}
update_client::CrxInstaller::Result
MediaEngagementPreloadComponentInstallerPolicy::OnCustomInstall(
const base::DictionaryValue& 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,
std::unique_ptr<base::DictionaryValue> manifest) {
base::TaskTraits task_traits = {
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::PostTaskWithTraits(FROM_HERE, task_traits, std::move(task));
} else {
base::PostTaskWithTraitsAndReply(FROM_HERE, task_traits, std::move(task),
std::move(on_load_closure_));
}
}
// Called during startup and installation before ComponentReady().
bool MediaEngagementPreloadComponentInstallerPolicy::VerifyInstallation(
const base::DictionaryValue& 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 + base::size(kMeiPreloadPublicKeySHA256));
}
std::string MediaEngagementPreloadComponentInstallerPolicy::GetName() const {
return kMediaEngagementPreloadManifestName;
}
update_client::InstallerAttributes
MediaEngagementPreloadComponentInstallerPolicy::GetInstallerAttributes() const {
return update_client::InstallerAttributes();
}
std::vector<std::string>
MediaEngagementPreloadComponentInstallerPolicy::GetMimeTypes() const {
return std::vector<std::string>();
}
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