blob: 324b8a3b5967f84abbed095bf4d6343faee8835d [file] [log] [blame]
[email protected]01253d272013-10-21 17:07:501// Copyright 2013 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
dcheng3b344bc22016-05-10 02:26:095#include <utility>
6
binjin1e1cc33a2014-10-09 18:08:167#include "base/json/json_reader.h"
[email protected]01253d272013-10-21 17:07:508#include "chrome/browser/extensions/external_policy_loader.h"
9#include "chrome/browser/extensions/policy_handlers.h"
[email protected]f6c403b2013-12-05 19:01:2510#include "components/policy/core/browser/policy_error_map.h"
[email protected]c4a138a2013-11-21 19:54:5711#include "components/policy/core/common/policy_map.h"
fhorschig64834b712015-09-21 14:20:2312#include "components/policy/core/common/policy_types.h"
binjin1e1cc33a2014-10-09 18:08:1613#include "components/policy/core/common/schema.h"
brettwb1fc1b82016-02-02 00:19:0814#include "components/prefs/pref_value_map.h"
[email protected]234fc5ff2014-01-16 23:32:2815#include "extensions/browser/pref_names.h"
[email protected]01253d272013-10-21 17:07:5016#include "policy/policy_constants.h"
17#include "testing/gtest/include/gtest/gtest.h"
18
19namespace extensions {
20
21const char kTestPref[] = "unit_test.test_pref";
binjin1e1cc33a2014-10-09 18:08:1622const char kTestManagementPolicy1[] =
23 "{"
24 " \"abcdefghijklmnopabcdefghijklmnop\": {"
25 " \"installation_mode\": \"force_installed\","
26 " },"
27 "}";
28const char kTestManagementPolicy2[] =
29 "{"
30 " \"abcdefghijklmnopabcdefghijklmnop\": {"
31 " \"installation_mode\": \"force_installed\","
32 " \"update_url\": \"http://example.com/app\","
33 " },"
34 " \"*\": {"
35 " \"installation_mode\": \"blocked\","
36 " },"
37 "}";
[email protected]01253d272013-10-21 17:07:5038
39TEST(ExtensionListPolicyHandlerTest, CheckPolicySettings) {
40 base::ListValue list;
41 policy::PolicyMap policy_map;
42 policy::PolicyErrorMap errors;
43 ExtensionListPolicyHandler handler(
44 policy::key::kExtensionInstallBlacklist, kTestPref, true);
45
46 policy_map.Set(policy::key::kExtensionInstallBlacklist,
dcheng3b344bc22016-05-10 02:26:0947 policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER,
48 policy::POLICY_SOURCE_CLOUD, list.CreateDeepCopy(), nullptr);
[email protected]01253d272013-10-21 17:07:5049 errors.Clear();
50 EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
51 EXPECT_TRUE(errors.empty());
52
dchengd9ea63862016-06-03 02:27:1853 list.AppendString("abcdefghijklmnopabcdefghijklmnop");
[email protected]01253d272013-10-21 17:07:5054 policy_map.Set(policy::key::kExtensionInstallBlacklist,
dcheng3b344bc22016-05-10 02:26:0955 policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER,
56 policy::POLICY_SOURCE_CLOUD, list.CreateDeepCopy(), nullptr);
[email protected]01253d272013-10-21 17:07:5057 errors.Clear();
58 EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
59 EXPECT_TRUE(errors.empty());
60
dchengd9ea63862016-06-03 02:27:1861 list.AppendString("*");
[email protected]01253d272013-10-21 17:07:5062 policy_map.Set(policy::key::kExtensionInstallBlacklist,
dcheng3b344bc22016-05-10 02:26:0963 policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER,
64 policy::POLICY_SOURCE_CLOUD, list.CreateDeepCopy(), nullptr);
[email protected]01253d272013-10-21 17:07:5065 errors.Clear();
66 EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
67 EXPECT_TRUE(errors.empty());
68
dchengd9ea63862016-06-03 02:27:1869 list.AppendString("invalid");
[email protected]01253d272013-10-21 17:07:5070 policy_map.Set(policy::key::kExtensionInstallBlacklist,
dcheng3b344bc22016-05-10 02:26:0971 policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER,
72 policy::POLICY_SOURCE_CLOUD, list.CreateDeepCopy(), nullptr);
[email protected]01253d272013-10-21 17:07:5073 errors.Clear();
74 EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
75 EXPECT_FALSE(errors.empty());
76 EXPECT_FALSE(
77 errors.GetErrors(policy::key::kExtensionInstallBlacklist).empty());
78}
79
80TEST(ExtensionListPolicyHandlerTest, ApplyPolicySettings) {
81 base::ListValue policy;
82 base::ListValue expected;
83 policy::PolicyMap policy_map;
84 PrefValueMap prefs;
85 base::Value* value = NULL;
86 ExtensionListPolicyHandler handler(
87 policy::key::kExtensionInstallBlacklist, kTestPref, false);
88
dchengd9ea63862016-06-03 02:27:1889 policy.AppendString("abcdefghijklmnopabcdefghijklmnop");
90 expected.AppendString("abcdefghijklmnopabcdefghijklmnop");
[email protected]01253d272013-10-21 17:07:5091
92 policy_map.Set(policy::key::kExtensionInstallBlacklist,
dcheng3b344bc22016-05-10 02:26:0993 policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER,
94 policy::POLICY_SOURCE_CLOUD, policy.CreateDeepCopy(), nullptr);
[email protected]01253d272013-10-21 17:07:5095 handler.ApplyPolicySettings(policy_map, &prefs);
96 EXPECT_TRUE(prefs.GetValue(kTestPref, &value));
97 EXPECT_TRUE(base::Value::Equals(&expected, value));
98
dchengd9ea63862016-06-03 02:27:1899 policy.AppendString("invalid");
[email protected]01253d272013-10-21 17:07:50100 policy_map.Set(policy::key::kExtensionInstallBlacklist,
dcheng3b344bc22016-05-10 02:26:09101 policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER,
102 policy::POLICY_SOURCE_CLOUD, policy.CreateDeepCopy(), nullptr);
[email protected]01253d272013-10-21 17:07:50103 handler.ApplyPolicySettings(policy_map, &prefs);
104 EXPECT_TRUE(prefs.GetValue(kTestPref, &value));
105 EXPECT_TRUE(base::Value::Equals(&expected, value));
106}
107
108TEST(ExtensionInstallForcelistPolicyHandlerTest, CheckPolicySettings) {
109 base::ListValue list;
110 policy::PolicyMap policy_map;
111 policy::PolicyErrorMap errors;
112 ExtensionInstallForcelistPolicyHandler handler;
113
114 policy_map.Set(policy::key::kExtensionInstallForcelist,
dcheng3b344bc22016-05-10 02:26:09115 policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER,
116 policy::POLICY_SOURCE_CLOUD, list.CreateDeepCopy(), nullptr);
[email protected]01253d272013-10-21 17:07:50117 errors.Clear();
118 EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
119 EXPECT_TRUE(errors.empty());
120
121 list.AppendString("abcdefghijklmnopabcdefghijklmnop;http://example.com");
122 policy_map.Set(policy::key::kExtensionInstallForcelist,
dcheng3b344bc22016-05-10 02:26:09123 policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER,
124 policy::POLICY_SOURCE_CLOUD, list.CreateDeepCopy(), nullptr);
[email protected]01253d272013-10-21 17:07:50125 errors.Clear();
126 EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
127 EXPECT_TRUE(errors.empty());
128
129 // Add an erroneous entry. This should generate an error, but the good
130 // entry should still be translated successfully.
131 list.AppendString("adfasdf;http://example.com");
132 policy_map.Set(policy::key::kExtensionInstallForcelist,
dcheng3b344bc22016-05-10 02:26:09133 policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER,
134 policy::POLICY_SOURCE_CLOUD, list.CreateDeepCopy(), nullptr);
[email protected]01253d272013-10-21 17:07:50135 errors.Clear();
136 EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
137 EXPECT_EQ(1U, errors.size());
138
139 // Add an entry with bad URL, which should generate another error.
140 list.AppendString("abcdefghijklmnopabcdefghijklmnop;nourl");
141 policy_map.Set(policy::key::kExtensionInstallForcelist,
dcheng3b344bc22016-05-10 02:26:09142 policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER,
143 policy::POLICY_SOURCE_CLOUD, list.CreateDeepCopy(), nullptr);
[email protected]01253d272013-10-21 17:07:50144 errors.Clear();
145 EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
146 EXPECT_EQ(2U, errors.size());
147
148 // Just an extension ID should also generate an error.
149 list.AppendString("abcdefghijklmnopabcdefghijklmnop");
150 policy_map.Set(policy::key::kExtensionInstallForcelist,
dcheng3b344bc22016-05-10 02:26:09151 policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER,
152 policy::POLICY_SOURCE_CLOUD, list.CreateDeepCopy(), nullptr);
[email protected]01253d272013-10-21 17:07:50153 errors.Clear();
154 EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
155 EXPECT_EQ(3U, errors.size());
156}
157
158TEST(ExtensionInstallForcelistPolicyHandlerTest, ApplyPolicySettings) {
159 base::ListValue policy;
160 base::DictionaryValue expected;
161 policy::PolicyMap policy_map;
162 PrefValueMap prefs;
163 base::Value* value = NULL;
164 ExtensionInstallForcelistPolicyHandler handler;
165
166 handler.ApplyPolicySettings(policy_map, &prefs);
[email protected]234fc5ff2014-01-16 23:32:28167 EXPECT_FALSE(prefs.GetValue(pref_names::kInstallForceList, &value));
[email protected]01253d272013-10-21 17:07:50168 EXPECT_FALSE(value);
169
170 policy_map.Set(policy::key::kExtensionInstallForcelist,
dcheng3b344bc22016-05-10 02:26:09171 policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER,
172 policy::POLICY_SOURCE_CLOUD, policy.CreateDeepCopy(), nullptr);
[email protected]01253d272013-10-21 17:07:50173 handler.ApplyPolicySettings(policy_map, &prefs);
[email protected]234fc5ff2014-01-16 23:32:28174 EXPECT_TRUE(prefs.GetValue(pref_names::kInstallForceList, &value));
[email protected]01253d272013-10-21 17:07:50175 EXPECT_TRUE(base::Value::Equals(&expected, value));
176
177 policy.AppendString("abcdefghijklmnopabcdefghijklmnop;http://example.com");
178 extensions::ExternalPolicyLoader::AddExtension(
179 &expected, "abcdefghijklmnopabcdefghijklmnop", "http://example.com");
180 policy_map.Set(policy::key::kExtensionInstallForcelist,
dcheng3b344bc22016-05-10 02:26:09181 policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER,
182 policy::POLICY_SOURCE_CLOUD, policy.CreateDeepCopy(), nullptr);
[email protected]01253d272013-10-21 17:07:50183 handler.ApplyPolicySettings(policy_map, &prefs);
[email protected]234fc5ff2014-01-16 23:32:28184 EXPECT_TRUE(prefs.GetValue(pref_names::kInstallForceList, &value));
[email protected]01253d272013-10-21 17:07:50185 EXPECT_TRUE(base::Value::Equals(&expected, value));
186
187 policy.AppendString("invalid");
188 policy_map.Set(policy::key::kExtensionInstallForcelist,
dcheng3b344bc22016-05-10 02:26:09189 policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER,
190 policy::POLICY_SOURCE_CLOUD, policy.CreateDeepCopy(), nullptr);
[email protected]01253d272013-10-21 17:07:50191 handler.ApplyPolicySettings(policy_map, &prefs);
[email protected]234fc5ff2014-01-16 23:32:28192 EXPECT_TRUE(prefs.GetValue(pref_names::kInstallForceList, &value));
[email protected]01253d272013-10-21 17:07:50193 EXPECT_TRUE(base::Value::Equals(&expected, value));
194}
195
196TEST(ExtensionURLPatternListPolicyHandlerTest, CheckPolicySettings) {
197 base::ListValue list;
198 policy::PolicyMap policy_map;
199 policy::PolicyErrorMap errors;
200 ExtensionURLPatternListPolicyHandler handler(
201 policy::key::kExtensionInstallSources, kTestPref);
202
203 policy_map.Set(policy::key::kExtensionInstallSources,
dcheng3b344bc22016-05-10 02:26:09204 policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER,
205 policy::POLICY_SOURCE_CLOUD, list.CreateDeepCopy(), nullptr);
[email protected]01253d272013-10-21 17:07:50206 errors.Clear();
207 EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
208 EXPECT_TRUE(errors.empty());
209
dchengd9ea63862016-06-03 02:27:18210 list.AppendString("http://*.google.com/*");
[email protected]01253d272013-10-21 17:07:50211 policy_map.Set(policy::key::kExtensionInstallSources,
dcheng3b344bc22016-05-10 02:26:09212 policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER,
213 policy::POLICY_SOURCE_CLOUD, list.CreateDeepCopy(), nullptr);
[email protected]01253d272013-10-21 17:07:50214 errors.Clear();
215 EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
216 EXPECT_TRUE(errors.empty());
217
dchengd9ea63862016-06-03 02:27:18218 list.AppendString("<all_urls>");
[email protected]01253d272013-10-21 17:07:50219 policy_map.Set(policy::key::kExtensionInstallSources,
dcheng3b344bc22016-05-10 02:26:09220 policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER,
221 policy::POLICY_SOURCE_CLOUD, list.CreateDeepCopy(), nullptr);
[email protected]01253d272013-10-21 17:07:50222 errors.Clear();
223 EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
224 EXPECT_TRUE(errors.empty());
225
dchengd9ea63862016-06-03 02:27:18226 list.AppendString("invalid");
[email protected]01253d272013-10-21 17:07:50227 policy_map.Set(policy::key::kExtensionInstallSources,
dcheng3b344bc22016-05-10 02:26:09228 policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER,
229 policy::POLICY_SOURCE_CLOUD, list.CreateDeepCopy(), nullptr);
[email protected]01253d272013-10-21 17:07:50230 errors.Clear();
231 EXPECT_FALSE(handler.CheckPolicySettings(policy_map, &errors));
232 EXPECT_FALSE(errors.empty());
233 EXPECT_FALSE(errors.GetErrors(policy::key::kExtensionInstallSources).empty());
234
235 // URLPattern syntax has a different way to express 'all urls'. Though '*'
236 // would be compatible today, it would be brittle, so we disallow.
dchengd9ea63862016-06-03 02:27:18237 list.AppendString("*");
[email protected]01253d272013-10-21 17:07:50238 policy_map.Set(policy::key::kExtensionInstallSources,
dcheng3b344bc22016-05-10 02:26:09239 policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER,
240 policy::POLICY_SOURCE_CLOUD, list.CreateDeepCopy(), nullptr);
[email protected]01253d272013-10-21 17:07:50241 errors.Clear();
242 EXPECT_FALSE(handler.CheckPolicySettings(policy_map, &errors));
243 EXPECT_FALSE(errors.empty());
244 EXPECT_FALSE(errors.GetErrors(policy::key::kExtensionInstallSources).empty());
245}
246
247TEST(ExtensionURLPatternListPolicyHandlerTest, ApplyPolicySettings) {
248 base::ListValue list;
249 policy::PolicyMap policy_map;
250 PrefValueMap prefs;
251 base::Value* value = NULL;
252 ExtensionURLPatternListPolicyHandler handler(
253 policy::key::kExtensionInstallSources, kTestPref);
254
dchengd9ea63862016-06-03 02:27:18255 list.AppendString("https://corp.monkey.net/*");
[email protected]01253d272013-10-21 17:07:50256 policy_map.Set(policy::key::kExtensionInstallSources,
dcheng3b344bc22016-05-10 02:26:09257 policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER,
258 policy::POLICY_SOURCE_CLOUD, list.CreateDeepCopy(), nullptr);
[email protected]01253d272013-10-21 17:07:50259 handler.ApplyPolicySettings(policy_map, &prefs);
260 ASSERT_TRUE(prefs.GetValue(kTestPref, &value));
261 EXPECT_TRUE(base::Value::Equals(&list, value));
262}
263
binjin1e1cc33a2014-10-09 18:08:16264TEST(ExtensionSettingsPolicyHandlerTest, CheckPolicySettings) {
265 std::string error;
dchengc963c7142016-04-08 03:55:22266 std::unique_ptr<base::Value> policy_value =
267 base::JSONReader::ReadAndReturnError(
268 kTestManagementPolicy1,
269 base::JSONParserOptions::JSON_ALLOW_TRAILING_COMMAS, NULL, &error);
binjin1e1cc33a2014-10-09 18:08:16270 ASSERT_TRUE(policy_value.get()) << error;
271
272 policy::Schema chrome_schema =
273 policy::Schema::Wrap(policy::GetChromeSchemaData());
274 policy::PolicyMap policy_map;
275 policy::PolicyErrorMap errors;
276 ExtensionSettingsPolicyHandler handler(chrome_schema);
277
278 policy_map.Set(policy::key::kExtensionSettings,
dcheng3b344bc22016-05-10 02:26:09279 policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER,
280 policy::POLICY_SOURCE_CLOUD, std::move(policy_value), nullptr);
binjin1e1cc33a2014-10-09 18:08:16281 // CheckPolicySettings() fails due to missing update URL.
282 EXPECT_FALSE(handler.CheckPolicySettings(policy_map, &errors));
283 EXPECT_FALSE(errors.empty());
284}
285
286TEST(ExtensionSettingsPolicyHandlerTest, ApplyPolicySettings) {
287 std::string error;
dchengc963c7142016-04-08 03:55:22288 std::unique_ptr<base::Value> policy_value =
289 base::JSONReader::ReadAndReturnError(
290 kTestManagementPolicy2,
291 base::JSONParserOptions::JSON_ALLOW_TRAILING_COMMAS, NULL, &error);
binjin1e1cc33a2014-10-09 18:08:16292 ASSERT_TRUE(policy_value.get()) << error;
293
294 policy::Schema chrome_schema =
295 policy::Schema::Wrap(policy::GetChromeSchemaData());
296 policy::PolicyMap policy_map;
297 policy::PolicyErrorMap errors;
298 PrefValueMap prefs;
299 ExtensionSettingsPolicyHandler handler(chrome_schema);
300
301 policy_map.Set(policy::key::kExtensionSettings,
dcheng3b344bc22016-05-10 02:26:09302 policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER,
303 policy::POLICY_SOURCE_CLOUD, policy_value->CreateDeepCopy(),
304 nullptr);
binjin1e1cc33a2014-10-09 18:08:16305 EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
306 handler.ApplyPolicySettings(policy_map, &prefs);
307 base::Value* value = NULL;
308 ASSERT_TRUE(prefs.GetValue(pref_names::kExtensionManagement, &value));
309 EXPECT_TRUE(base::Value::Equals(policy_value.get(), value));
310}
311
[email protected]01253d272013-10-21 17:07:50312} // namespace extensions