blob: 03228edaa6a8503be7bcd064de230d68f09edee7 [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
binjin1e1cc33a2014-10-09 18:08:165#include "base/json/json_reader.h"
[email protected]01253d272013-10-21 17:07:506#include "chrome/browser/extensions/external_policy_loader.h"
7#include "chrome/browser/extensions/policy_handlers.h"
[email protected]f6c403b2013-12-05 19:01:258#include "components/policy/core/browser/policy_error_map.h"
[email protected]c4a138a2013-11-21 19:54:579#include "components/policy/core/common/policy_map.h"
fhorschig64834b712015-09-21 14:20:2310#include "components/policy/core/common/policy_types.h"
binjin1e1cc33a2014-10-09 18:08:1611#include "components/policy/core/common/schema.h"
brettwb1fc1b82016-02-02 00:19:0812#include "components/prefs/pref_value_map.h"
[email protected]234fc5ff2014-01-16 23:32:2813#include "extensions/browser/pref_names.h"
[email protected]01253d272013-10-21 17:07:5014#include "policy/policy_constants.h"
15#include "testing/gtest/include/gtest/gtest.h"
16
17namespace extensions {
18
19const char kTestPref[] = "unit_test.test_pref";
binjin1e1cc33a2014-10-09 18:08:1620const char kTestManagementPolicy1[] =
21 "{"
22 " \"abcdefghijklmnopabcdefghijklmnop\": {"
23 " \"installation_mode\": \"force_installed\","
24 " },"
25 "}";
26const char kTestManagementPolicy2[] =
27 "{"
28 " \"abcdefghijklmnopabcdefghijklmnop\": {"
29 " \"installation_mode\": \"force_installed\","
30 " \"update_url\": \"http://example.com/app\","
31 " },"
32 " \"*\": {"
33 " \"installation_mode\": \"blocked\","
34 " },"
35 "}";
[email protected]01253d272013-10-21 17:07:5036
37TEST(ExtensionListPolicyHandlerTest, CheckPolicySettings) {
38 base::ListValue list;
39 policy::PolicyMap policy_map;
40 policy::PolicyErrorMap errors;
41 ExtensionListPolicyHandler handler(
42 policy::key::kExtensionInstallBlacklist, kTestPref, true);
43
44 policy_map.Set(policy::key::kExtensionInstallBlacklist,
45 policy::POLICY_LEVEL_MANDATORY,
46 policy::POLICY_SCOPE_USER,
fhorschig64834b712015-09-21 14:20:2347 policy::POLICY_SOURCE_CLOUD,
[email protected]01253d272013-10-21 17:07:5048 list.DeepCopy(),
49 NULL);
50 errors.Clear();
51 EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
52 EXPECT_TRUE(errors.empty());
53
[email protected]04be9802014-07-18 21:25:4554 list.Append(new base::StringValue("abcdefghijklmnopabcdefghijklmnop"));
[email protected]01253d272013-10-21 17:07:5055 policy_map.Set(policy::key::kExtensionInstallBlacklist,
56 policy::POLICY_LEVEL_MANDATORY,
57 policy::POLICY_SCOPE_USER,
fhorschig64834b712015-09-21 14:20:2358 policy::POLICY_SOURCE_CLOUD,
[email protected]01253d272013-10-21 17:07:5059 list.DeepCopy(),
60 NULL);
61 errors.Clear();
62 EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
63 EXPECT_TRUE(errors.empty());
64
[email protected]04be9802014-07-18 21:25:4565 list.Append(new base::StringValue("*"));
[email protected]01253d272013-10-21 17:07:5066 policy_map.Set(policy::key::kExtensionInstallBlacklist,
67 policy::POLICY_LEVEL_MANDATORY,
68 policy::POLICY_SCOPE_USER,
fhorschig64834b712015-09-21 14:20:2369 policy::POLICY_SOURCE_CLOUD,
[email protected]01253d272013-10-21 17:07:5070 list.DeepCopy(),
71 NULL);
72 errors.Clear();
73 EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
74 EXPECT_TRUE(errors.empty());
75
[email protected]04be9802014-07-18 21:25:4576 list.Append(new base::StringValue("invalid"));
[email protected]01253d272013-10-21 17:07:5077 policy_map.Set(policy::key::kExtensionInstallBlacklist,
78 policy::POLICY_LEVEL_MANDATORY,
79 policy::POLICY_SCOPE_USER,
fhorschig64834b712015-09-21 14:20:2380 policy::POLICY_SOURCE_CLOUD,
[email protected]01253d272013-10-21 17:07:5081 list.DeepCopy(),
82 NULL);
83 errors.Clear();
84 EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
85 EXPECT_FALSE(errors.empty());
86 EXPECT_FALSE(
87 errors.GetErrors(policy::key::kExtensionInstallBlacklist).empty());
88}
89
90TEST(ExtensionListPolicyHandlerTest, ApplyPolicySettings) {
91 base::ListValue policy;
92 base::ListValue expected;
93 policy::PolicyMap policy_map;
94 PrefValueMap prefs;
95 base::Value* value = NULL;
96 ExtensionListPolicyHandler handler(
97 policy::key::kExtensionInstallBlacklist, kTestPref, false);
98
[email protected]04be9802014-07-18 21:25:4599 policy.Append(new base::StringValue("abcdefghijklmnopabcdefghijklmnop"));
100 expected.Append(new base::StringValue("abcdefghijklmnopabcdefghijklmnop"));
[email protected]01253d272013-10-21 17:07:50101
102 policy_map.Set(policy::key::kExtensionInstallBlacklist,
103 policy::POLICY_LEVEL_MANDATORY,
104 policy::POLICY_SCOPE_USER,
fhorschig64834b712015-09-21 14:20:23105 policy::POLICY_SOURCE_CLOUD,
[email protected]01253d272013-10-21 17:07:50106 policy.DeepCopy(),
107 NULL);
108 handler.ApplyPolicySettings(policy_map, &prefs);
109 EXPECT_TRUE(prefs.GetValue(kTestPref, &value));
110 EXPECT_TRUE(base::Value::Equals(&expected, value));
111
[email protected]04be9802014-07-18 21:25:45112 policy.Append(new base::StringValue("invalid"));
[email protected]01253d272013-10-21 17:07:50113 policy_map.Set(policy::key::kExtensionInstallBlacklist,
114 policy::POLICY_LEVEL_MANDATORY,
115 policy::POLICY_SCOPE_USER,
fhorschig64834b712015-09-21 14:20:23116 policy::POLICY_SOURCE_CLOUD,
[email protected]01253d272013-10-21 17:07:50117 policy.DeepCopy(),
118 NULL);
119 handler.ApplyPolicySettings(policy_map, &prefs);
120 EXPECT_TRUE(prefs.GetValue(kTestPref, &value));
121 EXPECT_TRUE(base::Value::Equals(&expected, value));
122}
123
124TEST(ExtensionInstallForcelistPolicyHandlerTest, CheckPolicySettings) {
125 base::ListValue list;
126 policy::PolicyMap policy_map;
127 policy::PolicyErrorMap errors;
128 ExtensionInstallForcelistPolicyHandler handler;
129
130 policy_map.Set(policy::key::kExtensionInstallForcelist,
131 policy::POLICY_LEVEL_MANDATORY,
132 policy::POLICY_SCOPE_USER,
fhorschig64834b712015-09-21 14:20:23133 policy::POLICY_SOURCE_CLOUD,
[email protected]01253d272013-10-21 17:07:50134 list.DeepCopy(),
135 NULL);
136 errors.Clear();
137 EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
138 EXPECT_TRUE(errors.empty());
139
140 list.AppendString("abcdefghijklmnopabcdefghijklmnop;http://example.com");
141 policy_map.Set(policy::key::kExtensionInstallForcelist,
142 policy::POLICY_LEVEL_MANDATORY,
143 policy::POLICY_SCOPE_USER,
fhorschig64834b712015-09-21 14:20:23144 policy::POLICY_SOURCE_CLOUD,
[email protected]01253d272013-10-21 17:07:50145 list.DeepCopy(),
146 NULL);
147 errors.Clear();
148 EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
149 EXPECT_TRUE(errors.empty());
150
151 // Add an erroneous entry. This should generate an error, but the good
152 // entry should still be translated successfully.
153 list.AppendString("adfasdf;http://example.com");
154 policy_map.Set(policy::key::kExtensionInstallForcelist,
155 policy::POLICY_LEVEL_MANDATORY,
156 policy::POLICY_SCOPE_USER,
fhorschig64834b712015-09-21 14:20:23157 policy::POLICY_SOURCE_CLOUD,
[email protected]01253d272013-10-21 17:07:50158 list.DeepCopy(),
159 NULL);
160 errors.Clear();
161 EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
162 EXPECT_EQ(1U, errors.size());
163
164 // Add an entry with bad URL, which should generate another error.
165 list.AppendString("abcdefghijklmnopabcdefghijklmnop;nourl");
166 policy_map.Set(policy::key::kExtensionInstallForcelist,
167 policy::POLICY_LEVEL_MANDATORY,
168 policy::POLICY_SCOPE_USER,
fhorschig64834b712015-09-21 14:20:23169 policy::POLICY_SOURCE_CLOUD,
[email protected]01253d272013-10-21 17:07:50170 list.DeepCopy(),
171 NULL);
172 errors.Clear();
173 EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
174 EXPECT_EQ(2U, errors.size());
175
176 // Just an extension ID should also generate an error.
177 list.AppendString("abcdefghijklmnopabcdefghijklmnop");
178 policy_map.Set(policy::key::kExtensionInstallForcelist,
179 policy::POLICY_LEVEL_MANDATORY,
180 policy::POLICY_SCOPE_USER,
fhorschig64834b712015-09-21 14:20:23181 policy::POLICY_SOURCE_CLOUD,
[email protected]01253d272013-10-21 17:07:50182 list.DeepCopy(),
183 NULL);
184 errors.Clear();
185 EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
186 EXPECT_EQ(3U, errors.size());
187}
188
189TEST(ExtensionInstallForcelistPolicyHandlerTest, ApplyPolicySettings) {
190 base::ListValue policy;
191 base::DictionaryValue expected;
192 policy::PolicyMap policy_map;
193 PrefValueMap prefs;
194 base::Value* value = NULL;
195 ExtensionInstallForcelistPolicyHandler handler;
196
197 handler.ApplyPolicySettings(policy_map, &prefs);
[email protected]234fc5ff2014-01-16 23:32:28198 EXPECT_FALSE(prefs.GetValue(pref_names::kInstallForceList, &value));
[email protected]01253d272013-10-21 17:07:50199 EXPECT_FALSE(value);
200
201 policy_map.Set(policy::key::kExtensionInstallForcelist,
202 policy::POLICY_LEVEL_MANDATORY,
203 policy::POLICY_SCOPE_USER,
fhorschig64834b712015-09-21 14:20:23204 policy::POLICY_SOURCE_CLOUD,
[email protected]01253d272013-10-21 17:07:50205 policy.DeepCopy(),
206 NULL);
207 handler.ApplyPolicySettings(policy_map, &prefs);
[email protected]234fc5ff2014-01-16 23:32:28208 EXPECT_TRUE(prefs.GetValue(pref_names::kInstallForceList, &value));
[email protected]01253d272013-10-21 17:07:50209 EXPECT_TRUE(base::Value::Equals(&expected, value));
210
211 policy.AppendString("abcdefghijklmnopabcdefghijklmnop;http://example.com");
212 extensions::ExternalPolicyLoader::AddExtension(
213 &expected, "abcdefghijklmnopabcdefghijklmnop", "http://example.com");
214 policy_map.Set(policy::key::kExtensionInstallForcelist,
215 policy::POLICY_LEVEL_MANDATORY,
216 policy::POLICY_SCOPE_USER,
fhorschig64834b712015-09-21 14:20:23217 policy::POLICY_SOURCE_CLOUD,
[email protected]01253d272013-10-21 17:07:50218 policy.DeepCopy(),
219 NULL);
220 handler.ApplyPolicySettings(policy_map, &prefs);
[email protected]234fc5ff2014-01-16 23:32:28221 EXPECT_TRUE(prefs.GetValue(pref_names::kInstallForceList, &value));
[email protected]01253d272013-10-21 17:07:50222 EXPECT_TRUE(base::Value::Equals(&expected, value));
223
224 policy.AppendString("invalid");
225 policy_map.Set(policy::key::kExtensionInstallForcelist,
226 policy::POLICY_LEVEL_MANDATORY,
227 policy::POLICY_SCOPE_USER,
fhorschig64834b712015-09-21 14:20:23228 policy::POLICY_SOURCE_CLOUD,
[email protected]01253d272013-10-21 17:07:50229 policy.DeepCopy(),
230 NULL);
231 handler.ApplyPolicySettings(policy_map, &prefs);
[email protected]234fc5ff2014-01-16 23:32:28232 EXPECT_TRUE(prefs.GetValue(pref_names::kInstallForceList, &value));
[email protected]01253d272013-10-21 17:07:50233 EXPECT_TRUE(base::Value::Equals(&expected, value));
234}
235
236TEST(ExtensionURLPatternListPolicyHandlerTest, CheckPolicySettings) {
237 base::ListValue list;
238 policy::PolicyMap policy_map;
239 policy::PolicyErrorMap errors;
240 ExtensionURLPatternListPolicyHandler handler(
241 policy::key::kExtensionInstallSources, kTestPref);
242
243 policy_map.Set(policy::key::kExtensionInstallSources,
244 policy::POLICY_LEVEL_MANDATORY,
245 policy::POLICY_SCOPE_USER,
fhorschig64834b712015-09-21 14:20:23246 policy::POLICY_SOURCE_CLOUD,
[email protected]01253d272013-10-21 17:07:50247 list.DeepCopy(),
248 NULL);
249 errors.Clear();
250 EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
251 EXPECT_TRUE(errors.empty());
252
[email protected]04be9802014-07-18 21:25:45253 list.Append(new base::StringValue("http://*.google.com/*"));
[email protected]01253d272013-10-21 17:07:50254 policy_map.Set(policy::key::kExtensionInstallSources,
255 policy::POLICY_LEVEL_MANDATORY,
256 policy::POLICY_SCOPE_USER,
fhorschig64834b712015-09-21 14:20:23257 policy::POLICY_SOURCE_CLOUD,
[email protected]01253d272013-10-21 17:07:50258 list.DeepCopy(),
259 NULL);
260 errors.Clear();
261 EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
262 EXPECT_TRUE(errors.empty());
263
[email protected]04be9802014-07-18 21:25:45264 list.Append(new base::StringValue("<all_urls>"));
[email protected]01253d272013-10-21 17:07:50265 policy_map.Set(policy::key::kExtensionInstallSources,
266 policy::POLICY_LEVEL_MANDATORY,
267 policy::POLICY_SCOPE_USER,
fhorschig64834b712015-09-21 14:20:23268 policy::POLICY_SOURCE_CLOUD,
[email protected]01253d272013-10-21 17:07:50269 list.DeepCopy(),
270 NULL);
271 errors.Clear();
272 EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
273 EXPECT_TRUE(errors.empty());
274
[email protected]04be9802014-07-18 21:25:45275 list.Append(new base::StringValue("invalid"));
[email protected]01253d272013-10-21 17:07:50276 policy_map.Set(policy::key::kExtensionInstallSources,
277 policy::POLICY_LEVEL_MANDATORY,
278 policy::POLICY_SCOPE_USER,
fhorschig64834b712015-09-21 14:20:23279 policy::POLICY_SOURCE_CLOUD,
[email protected]01253d272013-10-21 17:07:50280 list.DeepCopy(),
281 NULL);
282 errors.Clear();
283 EXPECT_FALSE(handler.CheckPolicySettings(policy_map, &errors));
284 EXPECT_FALSE(errors.empty());
285 EXPECT_FALSE(errors.GetErrors(policy::key::kExtensionInstallSources).empty());
286
287 // URLPattern syntax has a different way to express 'all urls'. Though '*'
288 // would be compatible today, it would be brittle, so we disallow.
[email protected]04be9802014-07-18 21:25:45289 list.Append(new base::StringValue("*"));
[email protected]01253d272013-10-21 17:07:50290 policy_map.Set(policy::key::kExtensionInstallSources,
291 policy::POLICY_LEVEL_MANDATORY,
292 policy::POLICY_SCOPE_USER,
fhorschig64834b712015-09-21 14:20:23293 policy::POLICY_SOURCE_CLOUD,
[email protected]01253d272013-10-21 17:07:50294 list.DeepCopy(),
295 NULL);
296 errors.Clear();
297 EXPECT_FALSE(handler.CheckPolicySettings(policy_map, &errors));
298 EXPECT_FALSE(errors.empty());
299 EXPECT_FALSE(errors.GetErrors(policy::key::kExtensionInstallSources).empty());
300}
301
302TEST(ExtensionURLPatternListPolicyHandlerTest, ApplyPolicySettings) {
303 base::ListValue list;
304 policy::PolicyMap policy_map;
305 PrefValueMap prefs;
306 base::Value* value = NULL;
307 ExtensionURLPatternListPolicyHandler handler(
308 policy::key::kExtensionInstallSources, kTestPref);
309
[email protected]04be9802014-07-18 21:25:45310 list.Append(new base::StringValue("https://corp.monkey.net/*"));
[email protected]01253d272013-10-21 17:07:50311 policy_map.Set(policy::key::kExtensionInstallSources,
312 policy::POLICY_LEVEL_MANDATORY,
313 policy::POLICY_SCOPE_USER,
fhorschig64834b712015-09-21 14:20:23314 policy::POLICY_SOURCE_CLOUD,
[email protected]01253d272013-10-21 17:07:50315 list.DeepCopy(),
316 NULL);
317 handler.ApplyPolicySettings(policy_map, &prefs);
318 ASSERT_TRUE(prefs.GetValue(kTestPref, &value));
319 EXPECT_TRUE(base::Value::Equals(&list, value));
320}
321
binjin1e1cc33a2014-10-09 18:08:16322TEST(ExtensionSettingsPolicyHandlerTest, CheckPolicySettings) {
323 std::string error;
estadeb09312b2015-05-22 16:30:13324 scoped_ptr<base::Value> policy_value = base::JSONReader::ReadAndReturnError(
binjin1e1cc33a2014-10-09 18:08:16325 kTestManagementPolicy1,
estadeb09312b2015-05-22 16:30:13326 base::JSONParserOptions::JSON_ALLOW_TRAILING_COMMAS, NULL, &error);
binjin1e1cc33a2014-10-09 18:08:16327 ASSERT_TRUE(policy_value.get()) << error;
328
329 policy::Schema chrome_schema =
330 policy::Schema::Wrap(policy::GetChromeSchemaData());
331 policy::PolicyMap policy_map;
332 policy::PolicyErrorMap errors;
333 ExtensionSettingsPolicyHandler handler(chrome_schema);
334
335 policy_map.Set(policy::key::kExtensionSettings,
336 policy::POLICY_LEVEL_MANDATORY,
337 policy::POLICY_SCOPE_USER,
fhorschig64834b712015-09-21 14:20:23338 policy::POLICY_SOURCE_CLOUD,
binjin1e1cc33a2014-10-09 18:08:16339 policy_value.release(),
340 NULL);
341 // CheckPolicySettings() fails due to missing update URL.
342 EXPECT_FALSE(handler.CheckPolicySettings(policy_map, &errors));
343 EXPECT_FALSE(errors.empty());
344}
345
346TEST(ExtensionSettingsPolicyHandlerTest, ApplyPolicySettings) {
347 std::string error;
estadeb09312b2015-05-22 16:30:13348 scoped_ptr<base::Value> policy_value = base::JSONReader::ReadAndReturnError(
binjin1e1cc33a2014-10-09 18:08:16349 kTestManagementPolicy2,
estadeb09312b2015-05-22 16:30:13350 base::JSONParserOptions::JSON_ALLOW_TRAILING_COMMAS, NULL, &error);
binjin1e1cc33a2014-10-09 18:08:16351 ASSERT_TRUE(policy_value.get()) << error;
352
353 policy::Schema chrome_schema =
354 policy::Schema::Wrap(policy::GetChromeSchemaData());
355 policy::PolicyMap policy_map;
356 policy::PolicyErrorMap errors;
357 PrefValueMap prefs;
358 ExtensionSettingsPolicyHandler handler(chrome_schema);
359
360 policy_map.Set(policy::key::kExtensionSettings,
361 policy::POLICY_LEVEL_MANDATORY,
362 policy::POLICY_SCOPE_USER,
fhorschig64834b712015-09-21 14:20:23363 policy::POLICY_SOURCE_CLOUD,
binjin1e1cc33a2014-10-09 18:08:16364 policy_value->DeepCopy(),
365 NULL);
366 EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
367 handler.ApplyPolicySettings(policy_map, &prefs);
368 base::Value* value = NULL;
369 ASSERT_TRUE(prefs.GetValue(pref_names::kExtensionManagement, &value));
370 EXPECT_TRUE(base::Value::Equals(policy_value.get(), value));
371}
372
[email protected]01253d272013-10-21 17:07:50373} // namespace extensions