blob: 0b4aa8a98cdfb4b12026122249919239eac76f18 [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/scanner/force_installed_extension_scanner_impl.h"
#include <memory>
#include <set>
#include <utility>
#include "base/strings/utf_string_conversions.h"
#include "base/synchronization/waitable_event.h"
#include "chrome/chrome_cleaner/chrome_utils/extensions_util.h"
#include "chrome/chrome_cleaner/chrome_utils/force_installed_extension.h"
#include "chrome/chrome_cleaner/os/resource_util.h"
namespace chrome_cleaner {
using base::WaitableEvent;
ForceInstalledExtensionScannerImpl::ForceInstalledExtensionScannerImpl() =
default;
ForceInstalledExtensionScannerImpl::~ForceInstalledExtensionScannerImpl() =
default;
std::unique_ptr<UwEMatchers>
ForceInstalledExtensionScannerImpl::CreateUwEMatchersFromResource(
int resource_id) {
base::StringPiece serialized_matcher_pb;
if (!chrome_cleaner::LoadResourceOfKind(resource_id, L"TEXT",
&serialized_matcher_pb)) {
LOG(DFATAL) << "Failed to load expected UwE matchers from resource id "
<< resource_id;
return nullptr;
}
chrome_cleaner::UwEMatchers matcher;
matcher.ParseFromString(serialized_matcher_pb.as_string());
return std::make_unique<chrome_cleaner::UwEMatchers>(matcher);
}
std::vector<ForceInstalledExtension>
ForceInstalledExtensionScannerImpl::GetForceInstalledExtensions(
JsonParserAPI* json_parser) {
const base::TimeTicks end_time =
base::TimeTicks::Now() +
base::TimeDelta::FromMilliseconds(kParseAttemptTimeoutMilliseconds);
std::vector<ExtensionPolicyRegistryEntry> policy_registry_entries_force_list;
GetExtensionForcelistRegistryPolicies(&policy_registry_entries_force_list);
std::vector<ExtensionPolicyFile> policy_files_default_extensions;
WaitableEvent non_whitelist_default_extensions_done{
WaitableEvent::ResetPolicy::MANUAL,
WaitableEvent::InitialState::NOT_SIGNALED};
GetNonWhitelistedDefaultExtensions(json_parser,
&policy_files_default_extensions,
&non_whitelist_default_extensions_done);
std::vector<ExtensionPolicyRegistryEntry>
policy_registry_entries_force_installed;
WaitableEvent settings_force_installed_done{
WaitableEvent::ResetPolicy::MANUAL,
WaitableEvent::InitialState::NOT_SIGNALED};
GetExtensionSettingsForceInstalledExtensions(
json_parser, &policy_registry_entries_force_installed,
&settings_force_installed_done);
std::vector<ExtensionPolicyFile> policy_files_master_preferences;
WaitableEvent master_preferences_done{
WaitableEvent::ResetPolicy::MANUAL,
WaitableEvent::InitialState::NOT_SIGNALED};
GetMasterPreferencesExtensions(json_parser, &policy_files_master_preferences,
&master_preferences_done);
std::set<ForceInstalledExtension> result;
while (policy_registry_entries_force_list.size() > 0) {
ExtensionPolicyRegistryEntry entry =
std::move(policy_registry_entries_force_list.back());
policy_registry_entries_force_list.pop_back();
base::Optional<ExtensionID> extension_id =
ExtensionID::Create(base::UTF16ToUTF8(entry.extension_id));
if (!extension_id.has_value()) {
continue;
}
ForceInstalledExtension extension(extension_id.value(),
POLICY_EXTENSION_FORCELIST);
result.emplace(std::move(extension));
}
non_whitelist_default_extensions_done.TimedWaitUntil(end_time);
while (policy_files_default_extensions.size() > 0) {
ExtensionPolicyFile file =
std::move(policy_files_default_extensions.back());
policy_files_default_extensions.pop_back();
base::Optional<ExtensionID> extension_id =
ExtensionID::Create(base::UTF16ToUTF8(file.extension_id));
if (!extension_id.has_value()) {
continue;
}
ForceInstalledExtension extension(extension_id.value(),
DEFAULT_APPS_EXTENSION);
extension.policy_file =
std::make_shared<ExtensionPolicyFile>(std::move(file));
result.emplace(std::move(extension));
}
settings_force_installed_done.TimedWaitUntil(end_time);
while (policy_registry_entries_force_installed.size() > 0) {
ExtensionPolicyRegistryEntry entry =
std::move(policy_registry_entries_force_installed.back());
policy_registry_entries_force_installed.pop_back();
base::Optional<ExtensionID> extension_id =
ExtensionID::Create(base::UTF16ToUTF8(entry.extension_id));
if (!extension_id.has_value()) {
continue;
}
ForceInstalledExtension extension(extension_id.value(),
POLICY_EXTENSION_SETTINGS);
extension.policy_registry_entry =
std::make_shared<ExtensionPolicyRegistryEntry>(std::move(entry));
result.emplace(std::move(extension));
}
master_preferences_done.TimedWaitUntil(end_time);
while (policy_files_master_preferences.size() > 0) {
ExtensionPolicyFile file =
std::move(policy_files_master_preferences.back());
policy_files_master_preferences.pop_back();
base::Optional<ExtensionID> extension_id =
ExtensionID::Create(base::UTF16ToUTF8(file.extension_id));
if (!extension_id.has_value()) {
continue;
}
ForceInstalledExtension extension(extension_id.value(),
POLICY_MASTER_PREFERENCES);
extension.policy_file =
std::make_shared<ExtensionPolicyFile>(std::move(file));
result.emplace(std::move(extension));
}
return std::vector<ForceInstalledExtension>(result.begin(), result.end());
}
} // namespace chrome_cleaner