blob: 9bb8a4120824ce040277da9ed269be90b4efc60a [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.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