blob: 3169494ce255a9cf61cd4876492858a2fcd2c315 [file] [log] [blame]
// Copyright 2018 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/policy/chrome_extension_policy_migrator.h"
#include "extensions/common/hashed_extension_id.h"
namespace policy {
void ChromeExtensionPolicyMigrator::CopyPoliciesIfUnset(
PolicyBundle* bundle,
const std::string& hashed_extension_id,
base::span<const Migration> migrations) {
// HashedExtensionId gives an all-uppercase output, so make sure the input is
// all uppercase.
std::string hashed_extension_id_uppercase = hashed_extension_id;
std::transform(hashed_extension_id_uppercase.begin(),
hashed_extension_id_uppercase.end(),
hashed_extension_id_uppercase.begin(), ::toupper);
// Look for an extension with this hash.
PolicyMap* extension_map = nullptr;
for (auto& policy : *bundle) {
const PolicyNamespace& policy_namespace = policy.first;
if (policy_namespace.domain == PolicyDomain::POLICY_DOMAIN_EXTENSIONS &&
extensions::HashedExtensionId(policy_namespace.component_id).value() ==
hashed_extension_id_uppercase) {
extension_map = policy.second.get();
break;
}
}
if (extension_map == nullptr || extension_map->empty())
return;
PolicyMap& chrome_map = bundle->Get(PolicyNamespace(
PolicyDomain::POLICY_DOMAIN_CHROME, /* component_id */ std::string()));
for (const auto& migration : migrations) {
PolicyMap::Entry* entry = extension_map->GetMutable(migration.old_name);
if (entry) {
if (!chrome_map.Get(migration.new_name)) {
chrome_map.Set(migration.new_name, entry->DeepCopy());
}
// TODO(crbug/869958): Mark the old policy as deprecated for
// chrome://policy.
}
}
}
} // namespace policy