[go: nahoru, domu]

blob: 3a26101d585e6fd5e306d9980f0cae87b35348dd [file] [log] [blame]
// Copyright 2020 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/updater/external_constants_builder.h"
#include <iterator>
#include <optional>
#include <string>
#include <utility>
#include <vector>
#include "base/files/file_util.h"
#include "base/json/json_file_value_serializer.h"
#include "base/logging.h"
#include "base/numerics/safe_conversions.h"
#include "base/time/time.h"
#include "base/values.h"
#include "chrome/updater/constants.h"
#include "chrome/updater/external_constants_default.h"
#include "chrome/updater/external_constants_override.h"
#include "chrome/updater/updater_scope.h"
#include "chrome/updater/util/util.h"
#include "components/crx_file/crx_verifier.h"
#include "url/gurl.h"
namespace updater {
namespace {
std::vector<std::string> StringVectorFromGURLVector(
const std::vector<GURL>& gurls) {
std::vector<std::string> ret;
ret.reserve(gurls.size());
base::ranges::transform(gurls, std::back_inserter(ret), [](const GURL& gurl) {
return gurl.possibly_invalid_spec();
});
return ret;
}
} // namespace
ExternalConstantsBuilder::~ExternalConstantsBuilder() {
LOG_IF(WARNING, !written_)
<< "An ExternalConstantsBuilder with " << overrides_.size()
<< " entries is being " << "discarded without being written to a file.";
}
ExternalConstantsBuilder& ExternalConstantsBuilder::SetUpdateURL(
const std::vector<std::string>& urls) {
base::Value::List url_list;
url_list.reserve(urls.size());
for (const std::string& url_string : urls) {
url_list.Append(url_string);
}
overrides_.Set(kDevOverrideKeyUrl, std::move(url_list));
return *this;
}
ExternalConstantsBuilder& ExternalConstantsBuilder::ClearUpdateURL() {
overrides_.Remove(kDevOverrideKeyUrl);
return *this;
}
ExternalConstantsBuilder& ExternalConstantsBuilder::SetCrashUploadURL(
const std::string& url) {
overrides_.Set(kDevOverrideKeyCrashUploadUrl, url);
return *this;
}
ExternalConstantsBuilder& ExternalConstantsBuilder::ClearCrashUploadURL() {
overrides_.Remove(kDevOverrideKeyCrashUploadUrl);
return *this;
}
ExternalConstantsBuilder& ExternalConstantsBuilder::SetDeviceManagementURL(
const std::string& url) {
overrides_.Set(kDevOverrideKeyDeviceManagementUrl, url);
return *this;
}
ExternalConstantsBuilder& ExternalConstantsBuilder::ClearDeviceManagementURL() {
overrides_.Remove(kDevOverrideKeyDeviceManagementUrl);
return *this;
}
ExternalConstantsBuilder& ExternalConstantsBuilder::SetUseCUP(bool use_cup) {
overrides_.Set(kDevOverrideKeyUseCUP, use_cup);
return *this;
}
ExternalConstantsBuilder& ExternalConstantsBuilder::ClearUseCUP() {
overrides_.Remove(kDevOverrideKeyUseCUP);
return *this;
}
ExternalConstantsBuilder& ExternalConstantsBuilder::SetInitialDelay(
base::TimeDelta initial_delay) {
overrides_.Set(kDevOverrideKeyInitialDelay, initial_delay.InSecondsF());
return *this;
}
ExternalConstantsBuilder& ExternalConstantsBuilder::ClearInitialDelay() {
overrides_.Remove(kDevOverrideKeyInitialDelay);
return *this;
}
ExternalConstantsBuilder& ExternalConstantsBuilder::SetServerKeepAliveTime(
base::TimeDelta server_keep_alive_time) {
overrides_.Set(kDevOverrideKeyServerKeepAliveSeconds,
base::checked_cast<int>(server_keep_alive_time.InSeconds()));
return *this;
}
ExternalConstantsBuilder&
ExternalConstantsBuilder::ClearServerKeepAliveSeconds() {
overrides_.Remove(kDevOverrideKeyServerKeepAliveSeconds);
return *this;
}
ExternalConstantsBuilder& ExternalConstantsBuilder::SetCrxVerifierFormat(
crx_file::VerifierFormat crx_verifier_format) {
overrides_.Set(kDevOverrideKeyCrxVerifierFormat,
static_cast<int>(crx_verifier_format));
return *this;
}
ExternalConstantsBuilder& ExternalConstantsBuilder::ClearCrxVerifierFormat() {
overrides_.Remove(kDevOverrideKeyCrxVerifierFormat);
return *this;
}
ExternalConstantsBuilder& ExternalConstantsBuilder::SetGroupPolicies(
const base::Value::Dict& group_policies) {
overrides_.Set(kDevOverrideKeyGroupPolicies, group_policies.Clone());
return *this;
}
ExternalConstantsBuilder& ExternalConstantsBuilder::ClearGroupPolicies() {
overrides_.Remove(kDevOverrideKeyGroupPolicies);
return *this;
}
ExternalConstantsBuilder& ExternalConstantsBuilder::SetOverinstallTimeout(
const base::TimeDelta& overinstall_timeout) {
overrides_.Set(kDevOverrideKeyOverinstallTimeout,
static_cast<int>(overinstall_timeout.InSeconds()));
return *this;
}
ExternalConstantsBuilder& ExternalConstantsBuilder::ClearOverinstallTimeout() {
overrides_.Remove(kDevOverrideKeyOverinstallTimeout);
return *this;
}
ExternalConstantsBuilder& ExternalConstantsBuilder::SetIdleCheckPeriod(
const base::TimeDelta& idle_check_period) {
overrides_.Set(kDevOverrideKeyIdleCheckPeriodSeconds,
static_cast<int>(idle_check_period.InSeconds()));
return *this;
}
ExternalConstantsBuilder& ExternalConstantsBuilder::ClearIdleCheckPeriod() {
overrides_.Remove(kDevOverrideKeyIdleCheckPeriodSeconds);
return *this;
}
ExternalConstantsBuilder& ExternalConstantsBuilder::SetMachineManaged(
const std::optional<bool>& is_managed_device) {
if (is_managed_device.has_value()) {
overrides_.Set(kDevOverrideKeyManagedDevice, is_managed_device.value());
}
return *this;
}
ExternalConstantsBuilder& ExternalConstantsBuilder::ClearMachineManaged() {
overrides_.Remove(kDevOverrideKeyManagedDevice);
return *this;
}
ExternalConstantsBuilder& ExternalConstantsBuilder::SetEnableDiffUpdates(
bool enable_diffs) {
overrides_.Set(kDevOverrideKeyEnableDiffUpdates, enable_diffs);
return *this;
}
ExternalConstantsBuilder& ExternalConstantsBuilder::ClearEnableDiffUpdates() {
overrides_.Remove(kDevOverrideKeyEnableDiffUpdates);
return *this;
}
bool ExternalConstantsBuilder::Overwrite() {
const std::optional<base::FilePath> override_path =
GetOverrideFilePath(GetUpdaterScope());
if (!override_path) {
LOG(ERROR) << "Can't find base directory; can't save constant overrides.";
return false;
}
if (!base::CreateDirectory(override_path->DirName())) {
LOG(ERROR) << "Can't create " << override_path->value();
return false;
}
bool ok = JSONFileValueSerializer(*override_path).Serialize(overrides_);
written_ = written_ || ok;
return ok;
}
bool ExternalConstantsBuilder::Modify() {
scoped_refptr<ExternalConstantsOverrider> verifier =
ExternalConstantsOverrider::FromDefaultJSONFile(
CreateDefaultExternalConstants());
if (!verifier) {
return Overwrite();
}
if (!overrides_.contains(kDevOverrideKeyUrl)) {
SetUpdateURL(StringVectorFromGURLVector(verifier->UpdateURL()));
}
if (!overrides_.contains(kDevOverrideKeyCrashUploadUrl)) {
SetCrashUploadURL(verifier->CrashUploadURL().possibly_invalid_spec());
}
if (!overrides_.contains(kDevOverrideKeyDeviceManagementUrl)) {
SetDeviceManagementURL(
verifier->DeviceManagementURL().possibly_invalid_spec());
}
if (!overrides_.contains(kDevOverrideKeyUseCUP)) {
SetUseCUP(verifier->UseCUP());
}
if (!overrides_.contains(kDevOverrideKeyInitialDelay)) {
SetInitialDelay(verifier->InitialDelay());
}
if (!overrides_.contains(kDevOverrideKeyServerKeepAliveSeconds)) {
SetServerKeepAliveTime(verifier->ServerKeepAliveTime());
}
if (!overrides_.contains(kDevOverrideKeyCrxVerifierFormat)) {
SetCrxVerifierFormat(verifier->CrxVerifierFormat());
}
if (!overrides_.contains(kDevOverrideKeyGroupPolicies)) {
SetGroupPolicies(verifier->GroupPolicies());
}
if (!overrides_.contains(kDevOverrideKeyOverinstallTimeout)) {
SetOverinstallTimeout(verifier->OverinstallTimeout());
}
if (!overrides_.contains(kDevOverrideKeyIdleCheckPeriodSeconds)) {
SetIdleCheckPeriod(verifier->IdleCheckPeriod());
}
if (!overrides_.contains(kDevOverrideKeyManagedDevice)) {
SetMachineManaged(verifier->IsMachineManaged());
}
if (!overrides_.contains(kDevOverrideKeyEnableDiffUpdates)) {
SetEnableDiffUpdates(verifier->EnableDiffUpdates());
}
return Overwrite();
}
} // namespace updater