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