1 // Copyright 2018 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/chrome_cleaner/scanner/force_installed_extension_scanner.h"
6
7 #include "base/base_paths_win.h"
8 #include "base/files/file_path.h"
9 #include "base/files/file_util.h"
10 #include "base/path_service.h"
11 #include "base/strings/utf_string_conversions.h"
12 #include "base/test/scoped_path_override.h"
13 #include "base/test/test_reg_util_win.h"
14 #include "base/win/registry.h"
15 #include "chrome/chrome_cleaner/chrome_utils/extension_id.h"
16 #include "chrome/chrome_cleaner/os/registry_util.h"
17 #include "chrome/chrome_cleaner/parsers/json_parser/test_json_parser.h"
18 #include "chrome/chrome_cleaner/pup_data/test_uws.h"
19 #include "chrome/chrome_cleaner/scanner/force_installed_extension_scanner_impl.h"
20 #include "chrome/chrome_cleaner/test/test_extensions.h"
21 #include "chrome/chrome_cleaner/test/test_file_util.h"
22 #include "testing/gmock/include/gmock/gmock.h"
23 #include "testing/gtest/include/gtest/gtest.h"
24
25 namespace chrome_cleaner {
26
27 using testing::Contains;
28
TEST(UwEMatcherTest,GetForceInstalledExtensions)29 TEST(UwEMatcherTest, GetForceInstalledExtensions) {
30 ForceInstalledExtensionScannerImpl extension_scanner;
31 std::vector<ForceInstalledExtension> expected_extensions{
32 {ExtensionID::Create(base::WideToUTF8(kTestExtensionId1)).value(),
33 DEFAULT_APPS_EXTENSION},
34 {ExtensionID::Create(base::WideToUTF8(kTestExtensionId2)).value(),
35 DEFAULT_APPS_EXTENSION},
36 {ExtensionID::Create(base::WideToUTF8(kTestExtensionId5)).value(),
37 POLICY_EXTENSION_SETTINGS},
38 {ExtensionID::Create(base::WideToUTF8(kTestExtensionId4)).value(),
39 POLICY_EXTENSION_SETTINGS},
40 {ExtensionID::Create(base::WideToUTF8(kTestExtensionId3)).value(),
41 POLICY_EXTENSION_FORCELIST},
42 {ExtensionID::Create(base::WideToUTF8(kTestExtensionId6)).value(),
43 POLICY_MASTER_PREFERENCES},
44 {ExtensionID::Create(base::WideToUTF8(kTestExtensionId7)).value(),
45 POLICY_MASTER_PREFERENCES},
46 };
47 TestJsonParser json_parser;
48 registry_util::RegistryOverrideManager registry_override;
49 registry_override.OverrideRegistry(HKEY_LOCAL_MACHINE);
50 registry_override.OverrideRegistry(HKEY_CURRENT_USER);
51
52 // Add the force list registry entry
53 for (const TestRegistryEntry& policy : kExtensionForcelistEntries) {
54 base::win::RegKey policy_key;
55 ASSERT_EQ(ERROR_SUCCESS, policy_key.Create(HKEY_LOCAL_MACHINE,
56 kChromePoliciesForcelistKeyPath,
57 KEY_ALL_ACCESS));
58 ASSERT_TRUE(policy_key.Valid());
59 ASSERT_EQ(ERROR_SUCCESS,
60 policy_key.WriteValue(policy.name.c_str(), policy.value.c_str()));
61 }
62
63 // Add the UwE to the extension settings registry entry
64 base::win::RegKey settings_key;
65 ASSERT_EQ(ERROR_SUCCESS,
66 settings_key.Create(HKEY_LOCAL_MACHINE,
67 kExtensionSettingsPolicyPath, KEY_ALL_ACCESS));
68 ASSERT_TRUE(settings_key.Valid());
69 ASSERT_EQ(ERROR_SUCCESS,
70 settings_key.WriteValue(kExtensionSettingsName,
71 kExtensionSettingsJsonOnlyForced));
72
73 // Set up a fake default extensions JSON file.
74 base::ScopedPathOverride program_files_override(base::DIR_PROGRAM_FILES);
75 base::FilePath program_files_dir;
76 ASSERT_TRUE(
77 base::PathService::Get(base::DIR_PROGRAM_FILES, &program_files_dir));
78 base::FilePath fake_apps_dir(
79 program_files_dir.Append(kFakeChromeFolder).Append(L"default_apps"));
80 ASSERT_TRUE(base::CreateDirectoryAndGetError(fake_apps_dir, nullptr));
81 base::FilePath default_extensions_file =
82 fake_apps_dir.Append(L"external_extensions.json");
83 CreateFileWithContent(default_extensions_file, kDefaultExtensionsJson,
84 sizeof(kDefaultExtensionsJson) - 1);
85 ASSERT_TRUE(base::PathExists(default_extensions_file));
86
87 // Add the fake default extensions file.
88 base::FilePath chrome_dir(program_files_dir.Append(kChromeExePath));
89 ASSERT_TRUE(base::CreateDirectoryAndGetError(chrome_dir, nullptr));
90 base::FilePath master_preferences =
91 chrome_dir.Append(kMasterPreferencesFileName);
92 CreateFileWithContent(master_preferences, kMasterPreferencesJson,
93 sizeof(kMasterPreferencesJson) - 1);
94 ASSERT_TRUE(base::PathExists(master_preferences));
95
96 std::vector<ForceInstalledExtension> found_extensions =
97 extension_scanner.GetForceInstalledExtensions(&json_parser);
98 EXPECT_THAT(found_extensions,
99 testing::UnorderedElementsAreArray(expected_extensions));
100 }
101
TEST(UwEMatcherTest,GetNoForcedInstalledExtensions)102 TEST(UwEMatcherTest, GetNoForcedInstalledExtensions) {
103 ForceInstalledExtensionScannerImpl extension_scanner;
104 registry_util::RegistryOverrideManager registry_override;
105 registry_override.OverrideRegistry(HKEY_LOCAL_MACHINE);
106 registry_override.OverrideRegistry(HKEY_CURRENT_USER);
107
108 // Add the force list registry entry
109 base::win::RegKey policy_key;
110 ASSERT_EQ(ERROR_SUCCESS,
111 policy_key.Create(HKEY_LOCAL_MACHINE,
112 kChromePoliciesForcelistKeyPath, KEY_ALL_ACCESS));
113 ASSERT_TRUE(policy_key.Valid());
114
115 // Add the UwE to the extension settings registry entry
116 base::win::RegKey settings_key;
117 ASSERT_EQ(ERROR_SUCCESS,
118 settings_key.Create(HKEY_LOCAL_MACHINE,
119 kExtensionSettingsPolicyPath, KEY_ALL_ACCESS));
120 ASSERT_TRUE(settings_key.Valid());
121
122 // Set up a fake default extensions JSON file.
123 base::ScopedPathOverride program_files_override(base::DIR_PROGRAM_FILES);
124 base::FilePath program_files_dir;
125 ASSERT_TRUE(
126 base::PathService::Get(base::DIR_PROGRAM_FILES, &program_files_dir));
127 base::FilePath fake_apps_dir(
128 program_files_dir.Append(kFakeChromeFolder).Append(L"default_apps"));
129 ASSERT_TRUE(base::CreateDirectoryAndGetError(fake_apps_dir, nullptr));
130 base::FilePath default_extensions_file =
131 fake_apps_dir.Append(L"external_extensions.json");
132 CreateEmptyFile(default_extensions_file);
133 ASSERT_TRUE(base::PathExists(default_extensions_file));
134
135 // Add the fake default extensions file.
136 base::FilePath chrome_dir(program_files_dir.Append(kChromeExePath));
137 ASSERT_TRUE(base::CreateDirectoryAndGetError(chrome_dir, nullptr));
138 base::FilePath master_preferences =
139 chrome_dir.Append(kMasterPreferencesFileName);
140 CreateEmptyFile(master_preferences);
141 ASSERT_TRUE(base::PathExists(master_preferences));
142
143 TestJsonParser json_parser;
144 std::vector<ForceInstalledExtension> extensions =
145 extension_scanner.GetForceInstalledExtensions(&json_parser);
146 ASSERT_EQ(extensions, std::vector<ForceInstalledExtension>{});
147 }
148
149 } // namespace chrome_cleaner
150