blob: f6e1ab084963ee70590fb534d3b28189e65fb001 [file] [log] [blame]
// Copyright 2020 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/autofill_states_component_installer.h"
#include "base/files/file_path.h"
#include "base/files/file_util.h"
#include "base/logging.h"
#include "base/ranges/algorithm.h"
#include "base/task/post_task.h"
#include "components/autofill/core/browser/geo/country_data.h"
#include "components/autofill/core/common/autofill_prefs.h"
#include "components/component_updater/component_updater_service.h"
#include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h"
using content::BrowserThread;
namespace {
// The SHA256 of the SubjectPublicKeyInfo used to sign the extension.
// The extension id is: eeigpngbgcognadeebkilcpcaedhellh
const std::array<uint8_t, 32> kAutofillStatesPublicKeySHA256 = {
0x44, 0x86, 0xfd, 0x61, 0x62, 0xe6, 0xd0, 0x34, 0x41, 0xa8, 0xb2,
0xf2, 0x04, 0x37, 0x4b, 0xb7, 0x0b, 0xae, 0x93, 0x12, 0x9d, 0x58,
0x15, 0xb5, 0xdd, 0x89, 0xf2, 0x98, 0x73, 0xd3, 0x08, 0x97};
// Update the files installation path in prefs.
void UpdateAutofillStatesInstallDirPref(PrefService* prefs,
const base::FilePath& install_dir) {
prefs->SetFilePath(autofill::prefs::kAutofillStatesDataDir, install_dir);
}
// Returns the filenames corresponding to the states data.
std::vector<base::FilePath> AutofillStateFileNames() {
std::vector<base::FilePath> filenames;
for (const auto& country_code :
autofill::CountryDataMap::GetInstance()->country_codes()) {
filenames.push_back(base::FilePath().AppendASCII(country_code));
}
return filenames;
}
} // namespace
namespace component_updater {
AutofillStatesComponentInstallerPolicy::AutofillStatesComponentInstallerPolicy(
OnAutofillStatesReadyCallback callback)
: on_component_ready_callback_on_ui_(callback) {}
AutofillStatesComponentInstallerPolicy::
~AutofillStatesComponentInstallerPolicy() = default;
bool AutofillStatesComponentInstallerPolicy::
SupportsGroupPolicyEnabledComponentUpdates() const {
return false;
}
bool AutofillStatesComponentInstallerPolicy::RequiresNetworkEncryption() const {
return false;
}
update_client::CrxInstaller::Result
AutofillStatesComponentInstallerPolicy::OnCustomInstall(
const base::DictionaryValue& manifest,
const base::FilePath& install_dir) {
return update_client::CrxInstaller::Result(update_client::InstallError::NONE);
}
void AutofillStatesComponentInstallerPolicy::OnCustomUninstall() {}
void AutofillStatesComponentInstallerPolicy::ComponentReady(
const base::Version& version,
const base::FilePath& install_dir,
std::unique_ptr<base::DictionaryValue> manifest) {
DVLOG(1) << "Component ready, version " << version.GetString() << " in "
<< install_dir.value();
content::GetUIThreadTaskRunner(
{base::MayBlock(), base::TaskPriority::BEST_EFFORT})
->PostTask(FROM_HERE, base::BindOnce(on_component_ready_callback_on_ui_,
install_dir));
}
// Called during startup and installation before ComponentReady().
bool AutofillStatesComponentInstallerPolicy::VerifyInstallation(
const base::DictionaryValue& manifest,
const base::FilePath& install_dir) const {
// Verify that state files are present.
return base::ranges::count(
AutofillStateFileNames(), true, [&](const auto& filename) {
return base::PathExists(install_dir.Append(filename));
}) > 0;
}
base::FilePath AutofillStatesComponentInstallerPolicy::GetRelativeInstallDir()
const {
return base::FilePath(FILE_PATH_LITERAL("AutofillStates"));
}
void AutofillStatesComponentInstallerPolicy::GetHash(
std::vector<uint8_t>* hash) const {
hash->assign(kAutofillStatesPublicKeySHA256.begin(),
kAutofillStatesPublicKeySHA256.end());
}
std::string AutofillStatesComponentInstallerPolicy::GetName() const {
return "Autofill States Data";
}
update_client::InstallerAttributes
AutofillStatesComponentInstallerPolicy::GetInstallerAttributes() const {
return update_client::InstallerAttributes();
}
std::vector<std::string> AutofillStatesComponentInstallerPolicy::GetMimeTypes()
const {
return std::vector<std::string>();
}
void RegisterAutofillStatesComponent(ComponentUpdateService* cus,
PrefService* prefs) {
DVLOG(1) << "Registering Autofill States data component.";
auto installer = base::MakeRefCounted<ComponentInstaller>(
std::make_unique<AutofillStatesComponentInstallerPolicy>(
base::BindRepeating(&UpdateAutofillStatesInstallDirPref, prefs)));
installer->Register(cus, base::OnceClosure());
}
} // namespace component_updater