blob: 1182e8b321e76105d6a42dfc5b03d27b4b07eada [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/chrome_cleaner/chrome_utils/extensions_util.h"
#include "base/stl_util.h"
#include "base/win/registry.h"
#include "chrome/chrome_cleaner/os/registry_util.h"
#include "chrome/chrome_cleaner/os/system_util.h"
namespace chrome_cleaner {
namespace {
const int kExtensionIdLength = 32;
struct RegistryKey {
HKEY hkey;
const wchar_t* path;
};
const RegistryKey extension_forcelist_keys[] = {
{HKEY_LOCAL_MACHINE,
L"software\\policies\\google\\chrome\\ExtensionInstallForcelist"},
{HKEY_CURRENT_USER,
L"software\\policies\\google\\chrome\\ExtensionInstallForcelist"}};
void GetForcelistPoliciesForAccessMask(
REGSAM access_mask,
std::vector<ExtensionRegistryPolicy>* policies) {
for (size_t i = 0; i < base::size(extension_forcelist_keys); ++i) {
base::win::RegistryValueIterator forcelist_it(
extension_forcelist_keys[i].hkey, extension_forcelist_keys[i].path,
access_mask);
for (; forcelist_it.Valid(); ++forcelist_it) {
base::string16 entry;
GetRegistryValueAsString(forcelist_it.Value(), forcelist_it.ValueSize(),
forcelist_it.Type(), &entry);
// Extract the extension ID from the beginning of the registry entry,
// since it also contains an update URL.
if (entry.length() >= kExtensionIdLength) {
base::string16 extension_id = entry.substr(0, kExtensionIdLength);
policies->emplace_back(extension_id, extension_forcelist_keys[i].hkey,
extension_forcelist_keys[i].path,
forcelist_it.Name());
}
}
}
}
} // namespace
ExtensionRegistryPolicy::ExtensionRegistryPolicy(
const base::string16& extension_id,
HKEY hkey,
const base::string16& path,
const base::string16& name)
: extension_id(extension_id), hkey(hkey), path(path), name(name) {}
ExtensionRegistryPolicy::ExtensionRegistryPolicy(ExtensionRegistryPolicy&&) =
default;
ExtensionRegistryPolicy& ExtensionRegistryPolicy::operator=(
ExtensionRegistryPolicy&&) = default;
void GetExtensionForcelistRegistryPolicies(
std::vector<ExtensionRegistryPolicy>* policies) {
GetForcelistPoliciesForAccessMask(KEY_WOW64_32KEY, policies);
if (IsX64Architecture())
GetForcelistPoliciesForAccessMask(KEY_WOW64_64KEY, policies);
}
} // namespace chrome_cleaner