Commit 77af20dd authored by Joe Mason's avatar Joe Mason Committed by Commit Bot

Add extension scanner in chrome_cleaner

This updates the logging/proto and scanner subdirs

R=csharp@chromium.org

Bug: 830892
Change-Id: I15b1cfe9fdb123553b4d00c0e42395adbc068db3
Reviewed-on: https://chromium-review.googlesource.com/c/1338406
Commit-Queue: Joe Mason <joenotcharles@google.com>
Reviewed-by: default avatarChris Sharp <csharp@chromium.org>
Cr-Commit-Position: refs/heads/master@{#610192}
parent 6adbc9ea
...@@ -212,13 +212,16 @@ message ChromeCleanerReport { ...@@ -212,13 +212,16 @@ message ChromeCleanerReport {
optional SystemProxySettings win_http_proxy_settings = 9; optional SystemProxySettings win_http_proxy_settings = 9;
// Information about an extension that is installed. // Information about an extension that is installed.
// Next tag: 3. // Next tag: 4.
message InstalledExtension { message InstalledExtension {
// The ID of the extension that is installed. // The ID of the extension that is installed.
optional string extension_id = 1; optional string extension_id = 1;
// The method used to install the extension. // The method used to install the extension.
optional ExtensionInstallMethod install_method = 2; optional ExtensionInstallMethod install_method = 2;
// Information about the files that compose this extension.
repeated FileInformation extension_files = 3;
} }
repeated InstalledExtension installed_extensions = 12; repeated InstalledExtension installed_extensions = 12;
} }
......
...@@ -142,7 +142,7 @@ message MatchedScheduledTask { ...@@ -142,7 +142,7 @@ message MatchedScheduledTask {
optional ScheduledTask scheduled_task = 1; optional ScheduledTask scheduled_task = 1;
} }
// Next tag: 5 // Next tag: 4
message MatchedExtension { message MatchedExtension {
// The extension ID that the extension was installed with. // The extension ID that the extension was installed with.
optional string extension_id = 1; optional string extension_id = 1;
...@@ -153,9 +153,6 @@ message MatchedExtension { ...@@ -153,9 +153,6 @@ message MatchedExtension {
// The permissions the extension was installed based on the permissions field // The permissions the extension was installed based on the permissions field
// from the extension's manifest.json. // from the extension's manifest.json.
repeated string manifest_permissions = 3; repeated string manifest_permissions = 3;
// The files associated with an extension that should be deleted or reported.
repeated MatchedFile files = 4;
} }
// Information about a registry value. // Information about a registry value.
......
...@@ -72,6 +72,7 @@ source_set("scanner") { ...@@ -72,6 +72,7 @@ source_set("scanner") {
"//chrome/chrome_cleaner/chrome_utils:chrome_util_lib", "//chrome/chrome_cleaner/chrome_utils:chrome_util_lib",
"//chrome/chrome_cleaner/constants:common_strings", "//chrome/chrome_cleaner/constants:common_strings",
"//chrome/chrome_cleaner/logging:common", "//chrome/chrome_cleaner/logging:common",
"//chrome/chrome_cleaner/logging:logging_definitions",
"//chrome/chrome_cleaner/logging:scoped_timed_task_logger", "//chrome/chrome_cleaner/logging:scoped_timed_task_logger",
"//chrome/chrome_cleaner/os:common_os", "//chrome/chrome_cleaner/os:common_os",
"//chrome/chrome_cleaner/proto:shared_pup_enums_proto", "//chrome/chrome_cleaner/proto:shared_pup_enums_proto",
...@@ -112,25 +113,32 @@ source_set("unittest_sources") { ...@@ -112,25 +113,32 @@ source_set("unittest_sources") {
testonly = true testonly = true
sources = [ sources = [
"force_installed_extension_scanner_unittest.cc",
"matcher_util_unittest.cc", "matcher_util_unittest.cc",
"signature_matcher_unittest.cc", "signature_matcher_unittest.cc",
"urza_scanner_impl_unittest.cc", "urza_scanner_impl_unittest.cc",
] ]
deps = [ deps = [
":force_installed_extension_scanner",
":force_installed_extension_scanner_api",
":matcher_util", ":matcher_util",
":scanner", ":scanner",
":signature_matcher", ":signature_matcher",
"//base:base", "//base:base",
"//base/test:test_support", "//base/test:test_support",
"//chrome/chrome_cleaner/chrome_utils:chrome_util_lib", "//chrome/chrome_cleaner/chrome_utils:chrome_util_lib",
"//chrome/chrome_cleaner/chrome_utils:extension_id",
"//chrome/chrome_cleaner/constants:common_strings", "//chrome/chrome_cleaner/constants:common_strings",
"//chrome/chrome_cleaner/logging:common", "//chrome/chrome_cleaner/logging:common",
"//chrome/chrome_cleaner/logging:mock_logging_service", "//chrome/chrome_cleaner/logging:mock_logging_service",
"//chrome/chrome_cleaner/logging/proto:shared_data_proto", "//chrome/chrome_cleaner/logging/proto:shared_data_proto",
"//chrome/chrome_cleaner/os:common_os", "//chrome/chrome_cleaner/os:common_os",
"//chrome/chrome_cleaner/parsers/json_parser:json_parser",
"//chrome/chrome_cleaner/proto:shared_pup_enums_proto", "//chrome/chrome_cleaner/proto:shared_pup_enums_proto",
"//chrome/chrome_cleaner/pup_data:test_uws",
"//chrome/chrome_cleaner/strings", "//chrome/chrome_cleaner/strings",
"//chrome/chrome_cleaner/test:test_extensions",
"//chrome/chrome_cleaner/test:test_pup_data", "//chrome/chrome_cleaner/test:test_pup_data",
"//chrome/chrome_cleaner/test:test_strings", "//chrome/chrome_cleaner/test:test_strings",
"//chrome/chrome_cleaner/test:test_util", "//chrome/chrome_cleaner/test:test_util",
...@@ -140,3 +148,52 @@ source_set("unittest_sources") { ...@@ -140,3 +148,52 @@ source_set("unittest_sources") {
"//testing/gtest", "//testing/gtest",
] ]
} }
source_set("force_installed_extension_scanner_api") {
sources = [
"force_installed_extension_scanner.h",
]
deps = [
"//chrome/chrome_cleaner/chrome_utils:force_installed_extension",
"//chrome/chrome_cleaner/parsers/json_parser:json_parser",
"//chrome/chrome_cleaner/proto:uwe_matcher_proto",
]
}
source_set("force_installed_extension_scanner") {
sources = [
"force_installed_extension_scanner_impl.cc",
"force_installed_extension_scanner_impl.h",
]
deps = [
":force_installed_extension_scanner_api",
"//base",
"//chrome/chrome_cleaner/chrome_utils:extensions_util_lib",
"//chrome/chrome_cleaner/chrome_utils:force_installed_extension",
"//chrome/chrome_cleaner/os:common_os",
"//chrome/chrome_cleaner/parsers/json_parser:json_parser",
"//chrome/chrome_cleaner/proto:uwe_matcher_proto",
]
}
source_set("mock_force_installed_extension_scanner") {
testonly = true
sources = [
"mock_force_installed_extension_scanner.cc",
"mock_force_installed_extension_scanner.h",
]
deps = [
":force_installed_extension_scanner_api",
"//base",
"//chrome/chrome_cleaner/chrome_utils:extensions_util_lib",
"//chrome/chrome_cleaner/chrome_utils:force_installed_extension",
"//chrome/chrome_cleaner/os:common_os",
"//chrome/chrome_cleaner/parsers/json_parser:json_parser",
"//chrome/chrome_cleaner/proto:uwe_matcher_proto",
"//testing/gmock",
]
}
// 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.
#ifndef CHROME_CHROME_CLEANER_SCANNER_FORCE_INSTALLED_EXTENSION_SCANNER_H_
#define CHROME_CHROME_CLEANER_SCANNER_FORCE_INSTALLED_EXTENSION_SCANNER_H_
#include <memory>
#include <vector>
#include "chrome/chrome_cleaner/chrome_utils/force_installed_extension.h"
#include "chrome/chrome_cleaner/parsers/json_parser/json_parser_api.h"
#include "chrome/chrome_cleaner/proto/uwe_matcher.pb.h"
namespace chrome_cleaner {
class ForceInstalledExtensionScanner {
public:
virtual ~ForceInstalledExtensionScanner() {}
// Create a list of Matchers from the resource ID.
virtual std::unique_ptr<UwEMatchers> CreateUwEMatchersFromResource(
int resource_id) = 0;
// Gets a complete list of the force installed extensions that can then
// be matched with known UwS.
virtual std::vector<ForceInstalledExtension> GetForceInstalledExtensions(
JsonParserAPI* json_parser) = 0;
};
} // namespace chrome_cleaner
#endif // CHROME_CHROME_CLEANER_SCANNER_FORCE_INSTALLED_EXTENSION_SCANNER_H_
// 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
// 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.
#ifndef CHROME_CHROME_CLEANER_SCANNER_FORCE_INSTALLED_EXTENSION_SCANNER_IMPL_H_
#define CHROME_CHROME_CLEANER_SCANNER_FORCE_INSTALLED_EXTENSION_SCANNER_IMPL_H_
#include <memory>
#include <vector>
#include "chrome/chrome_cleaner/chrome_utils/force_installed_extension.h"
#include "chrome/chrome_cleaner/parsers/json_parser/json_parser_api.h"
#include "chrome/chrome_cleaner/proto/uwe_matcher.pb.h"
#include "chrome/chrome_cleaner/scanner/force_installed_extension_scanner.h"
namespace chrome_cleaner {
class ForceInstalledExtensionScannerImpl
: public ForceInstalledExtensionScanner {
public:
ForceInstalledExtensionScannerImpl();
~ForceInstalledExtensionScannerImpl() override;
// Create a list of Matchers from the resource ID.
std::unique_ptr<UwEMatchers> CreateUwEMatchersFromResource(
int resource_id) override;
// Gets a complete list of the force installed extensions that can then
// be matched with known UwS.
std::vector<ForceInstalledExtension> GetForceInstalledExtensions(
JsonParserAPI* json_parser) override;
};
} // namespace chrome_cleaner
#endif // CHROME_CHROME_CLEANER_SCANNER_FORCE_INSTALLED_EXTENSION_SCANNER_IMPL_H_
// 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.h"
#include "base/base_paths_win.h"
#include "base/files/file_path.h"
#include "base/files/file_util.h"
#include "base/path_service.h"
#include "base/strings/utf_string_conversions.h"
#include "base/test/scoped_path_override.h"
#include "base/test/test_reg_util_win.h"
#include "base/win/registry.h"
#include "chrome/chrome_cleaner/chrome_utils/extension_id.h"
#include "chrome/chrome_cleaner/os/registry_util.h"
#include "chrome/chrome_cleaner/parsers/json_parser/test_json_parser.h"
#include "chrome/chrome_cleaner/pup_data/test_uws.h"
#include "chrome/chrome_cleaner/scanner/force_installed_extension_scanner_impl.h"
#include "chrome/chrome_cleaner/test/test_extensions.h"
#include "chrome/chrome_cleaner/test/test_file_util.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace chrome_cleaner {
using testing::Contains;
TEST(UwEMatcherTest, GetForceInstalledExtensions) {
ForceInstalledExtensionScannerImpl extension_scanner;
std::vector<ForceInstalledExtension> expected_extensions{
{ExtensionID::Create(base::UTF16ToUTF8(kTestExtensionId1)).value(),
DEFAULT_APPS_EXTENSION},
{ExtensionID::Create(base::UTF16ToUTF8(kTestExtensionId2)).value(),
DEFAULT_APPS_EXTENSION},
{ExtensionID::Create(base::UTF16ToUTF8(kTestExtensionId5)).value(),
POLICY_EXTENSION_SETTINGS},
{ExtensionID::Create(base::UTF16ToUTF8(kTestExtensionId4)).value(),
POLICY_EXTENSION_SETTINGS},
{ExtensionID::Create(base::UTF16ToUTF8(kTestExtensionId3)).value(),
POLICY_EXTENSION_FORCELIST},
{ExtensionID::Create(base::UTF16ToUTF8(kTestExtensionId6)).value(),
POLICY_MASTER_PREFERENCES},
{ExtensionID::Create(base::UTF16ToUTF8(kTestExtensionId7)).value(),
POLICY_MASTER_PREFERENCES},
};
TestJsonParser json_parser;
registry_util::RegistryOverrideManager registry_override;
registry_override.OverrideRegistry(HKEY_LOCAL_MACHINE);
registry_override.OverrideRegistry(HKEY_CURRENT_USER);
// Add the force list registry entry
for (const TestRegistryEntry& policy : kExtensionForcelistEntries) {
base::win::RegKey policy_key;
ASSERT_EQ(ERROR_SUCCESS, policy_key.Create(HKEY_LOCAL_MACHINE,
kChromePoliciesForcelistKeyPath,
KEY_ALL_ACCESS));
ASSERT_TRUE(policy_key.Valid());
ASSERT_EQ(ERROR_SUCCESS,
policy_key.WriteValue(policy.name.c_str(), policy.value.c_str()));
}
// Add the UwE to the extension settings registry entry
base::win::RegKey settings_key;
ASSERT_EQ(ERROR_SUCCESS,
settings_key.Create(HKEY_LOCAL_MACHINE,
kExtensionSettingsPolicyPath, KEY_ALL_ACCESS));
ASSERT_TRUE(settings_key.Valid());
ASSERT_EQ(ERROR_SUCCESS,
settings_key.WriteValue(kExtensionSettingsName,
kExtensionSettingsJsonOnlyForced));
// Set up a fake default extensions JSON file.
base::ScopedPathOverride program_files_override(base::DIR_PROGRAM_FILES);
base::FilePath program_files_dir;
ASSERT_TRUE(
base::PathService::Get(base::DIR_PROGRAM_FILES, &program_files_dir));
base::FilePath fake_apps_dir(
program_files_dir.Append(kFakeChromeFolder).Append(L"default_apps"));
ASSERT_TRUE(base::CreateDirectoryAndGetError(fake_apps_dir, nullptr));
base::FilePath default_extensions_file =
fake_apps_dir.Append(L"external_extensions.json");
CreateFileWithContent(default_extensions_file, kDefaultExtensionsJson,
sizeof(kDefaultExtensionsJson) - 1);
ASSERT_TRUE(base::PathExists(default_extensions_file));
// Add the fake default extensions file.
base::FilePath chrome_dir(program_files_dir.Append(kChromeExePath));
ASSERT_TRUE(base::CreateDirectoryAndGetError(chrome_dir, nullptr));
base::FilePath master_preferences =
chrome_dir.Append(kMasterPreferencesFileName);
CreateFileWithContent(master_preferences, kMasterPreferencesJson,
sizeof(kMasterPreferencesJson) - 1);
ASSERT_TRUE(base::PathExists(master_preferences));
std::vector<ForceInstalledExtension> found_extensions =
extension_scanner.GetForceInstalledExtensions(&json_parser);
EXPECT_THAT(found_extensions,
testing::UnorderedElementsAreArray(expected_extensions));
}
TEST(UwEMatcherTest, GetNoForcedInstalledExtensions) {
ForceInstalledExtensionScannerImpl extension_scanner;
registry_util::RegistryOverrideManager registry_override;
registry_override.OverrideRegistry(HKEY_LOCAL_MACHINE);
registry_override.OverrideRegistry(HKEY_CURRENT_USER);
// Add the force list registry entry
base::win::RegKey policy_key;
ASSERT_EQ(ERROR_SUCCESS,
policy_key.Create(HKEY_LOCAL_MACHINE,
kChromePoliciesForcelistKeyPath, KEY_ALL_ACCESS));
ASSERT_TRUE(policy_key.Valid());
// Add the UwE to the extension settings registry entry
base::win::RegKey settings_key;
ASSERT_EQ(ERROR_SUCCESS,
settings_key.Create(HKEY_LOCAL_MACHINE,
kExtensionSettingsPolicyPath, KEY_ALL_ACCESS));
ASSERT_TRUE(settings_key.Valid());
// Set up a fake default extensions JSON file.
base::ScopedPathOverride program_files_override(base::DIR_PROGRAM_FILES);
base::FilePath program_files_dir;
ASSERT_TRUE(
base::PathService::Get(base::DIR_PROGRAM_FILES, &program_files_dir));
base::FilePath fake_apps_dir(
program_files_dir.Append(kFakeChromeFolder).Append(L"default_apps"));
ASSERT_TRUE(base::CreateDirectoryAndGetError(fake_apps_dir, nullptr));
base::FilePath default_extensions_file =
fake_apps_dir.Append(L"external_extensions.json");
CreateEmptyFile(default_extensions_file);
ASSERT_TRUE(base::PathExists(default_extensions_file));
// Add the fake default extensions file.
base::FilePath chrome_dir(program_files_dir.Append(kChromeExePath));
ASSERT_TRUE(base::CreateDirectoryAndGetError(chrome_dir, nullptr));
base::FilePath master_preferences =
chrome_dir.Append(kMasterPreferencesFileName);
CreateEmptyFile(master_preferences);
ASSERT_TRUE(base::PathExists(master_preferences));
TestJsonParser json_parser;
std::vector<ForceInstalledExtension> extensions =
extension_scanner.GetForceInstalledExtensions(&json_parser);
ASSERT_EQ(extensions, std::vector<ForceInstalledExtension>{});
}
} // namespace chrome_cleaner
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include "base/command_line.h" #include "base/command_line.h"
#include "base/path_service.h" #include "base/path_service.h"
#include "base/stl_util.h"
#include "base/strings/strcat.h" #include "base/strings/strcat.h"
#include "base/strings/string_number_conversions.h" #include "base/strings/string_number_conversions.h"
#include "base/test/scoped_path_override.h" #include "base/test/scoped_path_override.h"
......
// 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/mock_force_installed_extension_scanner.h"
namespace chrome_cleaner {
MockForceInstalledExtensionScanner::MockForceInstalledExtensionScanner() =
default;
MockForceInstalledExtensionScanner::~MockForceInstalledExtensionScanner() =
default;
} // namespace chrome_cleaner
// 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.
#ifndef CHROME_CHROME_CLEANER_SCANNER_MOCK_FORCE_INSTALLED_EXTENSION_SCANNER_H_
#define CHROME_CHROME_CLEANER_SCANNER_MOCK_FORCE_INSTALLED_EXTENSION_SCANNER_H_
#include <memory>
#include <vector>
#include "chrome/chrome_cleaner/chrome_utils/force_installed_extension.h"
#include "chrome/chrome_cleaner/parsers/json_parser/json_parser_api.h"
#include "chrome/chrome_cleaner/proto/uwe_matcher.pb.h"
#include "chrome/chrome_cleaner/scanner/force_installed_extension_scanner.h"
#include "testing/gmock/include/gmock/gmock.h"
namespace chrome_cleaner {
class MockForceInstalledExtensionScanner
: public ForceInstalledExtensionScanner {
public:
MockForceInstalledExtensionScanner();
~MockForceInstalledExtensionScanner() override;
MOCK_METHOD1(CreateUwEMatchersFromResource,
std::unique_ptr<UwEMatchers>(int resource_ids));
MOCK_METHOD1(
GetForceInstalledExtensions,
std::vector<ForceInstalledExtension>(JsonParserAPI* json_parser));
};
} // namespace chrome_cleaner
#endif // CHROME_CHROME_CLEANER_SCANNER_MOCK_FORCE_INSTALLED_EXTENSION_SCANNER_H_
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
#include "base/time/time.h" #include "base/time/time.h"
#include "base/win/registry.h" #include "base/win/registry.h"
#include "chrome/chrome_cleaner/constants/chrome_cleaner_switches.h" #include "chrome/chrome_cleaner/constants/chrome_cleaner_switches.h"
#include "chrome/chrome_cleaner/logging/logging_definitions.h"
#include "chrome/chrome_cleaner/logging/logging_service_api.h" #include "chrome/chrome_cleaner/logging/logging_service_api.h"
#include "chrome/chrome_cleaner/logging/registry_logger.h" #include "chrome/chrome_cleaner/logging/registry_logger.h"
#include "chrome/chrome_cleaner/logging/scoped_timed_task_logger.h" #include "chrome/chrome_cleaner/logging/scoped_timed_task_logger.h"
......
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
#include "base/path_service.h" #include "base/path_service.h"
#include "base/rand_util.h" #include "base/rand_util.h"
#include "base/run_loop.h" #include "base/run_loop.h"
#include "base/stl_util.h"
#include "base/strings/strcat.h" #include "base/strings/strcat.h"
#include "base/strings/string16.h" #include "base/strings/string16.h"
#include "base/strings/string_number_conversions.h" #include "base/strings/string_number_conversions.h"
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment