Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(475)

Side by Side Diff: chrome/common/extensions/permissions/permissions_data_unittest.cc

Issue 2499493004: Communicate ExtensionSettings policy to renderers (Closed)
Patch Set: -Added unit tests for PermissionsUpdater and PermissionsData, Removed unnecessary lock assertion, p… Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <stdint.h> 5 #include <stdint.h>
6 6
7 #include <utility> 7 #include <utility>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/command_line.h" 10 #include "base/command_line.h"
11 #include "base/memory/ref_counted.h" 11 #include "base/memory/ref_counted.h"
12 #include "base/strings/string16.h" 12 #include "base/strings/string16.h"
13 #include "base/strings/utf_string_conversions.h" 13 #include "base/strings/utf_string_conversions.h"
14 #include "build/build_config.h" 14 #include "build/build_config.h"
15 #include "chrome/common/extensions/extension_test_util.h" 15 #include "chrome/common/extensions/extension_test_util.h"
16 #include "components/crx_file/id_util.h" 16 #include "components/crx_file/id_util.h"
17 #include "content/public/common/socket_permission_request.h" 17 #include "content/public/common/socket_permission_request.h"
18 #include "extensions/common/constants.h"
18 #include "extensions/common/error_utils.h" 19 #include "extensions/common/error_utils.h"
19 #include "extensions/common/extension.h" 20 #include "extensions/common/extension.h"
20 #include "extensions/common/extension_builder.h" 21 #include "extensions/common/extension_builder.h"
21 #include "extensions/common/manifest.h" 22 #include "extensions/common/manifest.h"
22 #include "extensions/common/manifest_constants.h" 23 #include "extensions/common/manifest_constants.h"
23 #include "extensions/common/permissions/api_permission.h" 24 #include "extensions/common/permissions/api_permission.h"
24 #include "extensions/common/permissions/permission_message_test_util.h" 25 #include "extensions/common/permissions/permission_message_test_util.h"
25 #include "extensions/common/permissions/permission_set.h" 26 #include "extensions/common/permissions/permission_set.h"
26 #include "extensions/common/permissions/permissions_data.h" 27 #include "extensions/common/permissions/permissions_data.h"
27 #include "extensions/common/permissions/socket_permission.h" 28 #include "extensions/common/permissions/socket_permission.h"
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
70 .Set("version", "1.0.0") 71 .Set("version", "1.0.0")
71 .Set("permissions", permissions.Build()) 72 .Set("permissions", permissions.Build())
72 .Build()) 73 .Build())
73 .SetLocation(location) 74 .SetLocation(location)
74 .SetID(id) 75 .SetID(id)
75 .Build(); 76 .Build();
76 } 77 }
77 78
78 // Checks that urls are properly restricted for the given extension. 79 // Checks that urls are properly restricted for the given extension.
79 void CheckRestrictedUrls(const Extension* extension, 80 void CheckRestrictedUrls(const Extension* extension,
80 bool block_chrome_urls) { 81 bool block_chrome_urls,
82 bool block_google_urls) {
81 // We log the name so we know _which_ extension failed here. 83 // We log the name so we know _which_ extension failed here.
82 const std::string& name = extension->name(); 84 const std::string& name = extension->name();
83 const GURL chrome_settings_url("chrome://settings/"); 85 const GURL chrome_settings_url("chrome://settings/");
84 const GURL chrome_extension_url("chrome-extension://foo/bar.html"); 86 const GURL chrome_extension_url("chrome-extension://foo/bar.html");
85 const GURL google_url("https://www.google.com/"); 87 const GURL google_url("https://www.google.com/");
86 const GURL self_url("chrome-extension://" + extension->id() + "/foo.html"); 88 const GURL self_url("chrome-extension://" + extension->id() + "/foo.html");
87 const GURL invalid_url("chrome-debugger://foo/bar.html"); 89 const GURL invalid_url("chrome-debugger://foo/bar.html");
88 90
89 std::string error; 91 std::string error;
90 EXPECT_EQ(block_chrome_urls, 92 EXPECT_EQ(block_chrome_urls,
(...skipping 10 matching lines...) Expand all
101 EXPECT_EQ(block_chrome_urls, 103 EXPECT_EQ(block_chrome_urls,
102 PermissionsData::IsRestrictedUrl( 104 PermissionsData::IsRestrictedUrl(
103 chrome_extension_url, 105 chrome_extension_url,
104 extension, 106 extension,
105 &error)) << name; 107 &error)) << name;
106 if (block_chrome_urls) 108 if (block_chrome_urls)
107 EXPECT_EQ(manifest_errors::kCannotAccessExtensionUrl, error) << name; 109 EXPECT_EQ(manifest_errors::kCannotAccessExtensionUrl, error) << name;
108 else 110 else
109 EXPECT_TRUE(error.empty()) << name; 111 EXPECT_TRUE(error.empty()) << name;
110 112
111 // Google should never be a restricted url. 113 // Google shouldn't be restricted unless a runtime host restriction is applied
114 // by policy.
112 error.clear(); 115 error.clear();
113 EXPECT_FALSE(PermissionsData::IsRestrictedUrl( 116 EXPECT_EQ(block_google_urls,
114 google_url, extension, &error)) << name; 117 PermissionsData::IsRestrictedUrl(google_url, extension, &error))
115 EXPECT_TRUE(error.empty()) << name; 118 << name;
119 if (block_google_urls)
120 EXPECT_EQ(extension_misc::kPolicyBlockedScripting, error) << name;
121 else
122 EXPECT_TRUE(error.empty()) << name;
116 123
117 // We should always be able to access our own extension pages. 124 // We should always be able to access our own extension pages.
118 error.clear(); 125 error.clear();
119 EXPECT_FALSE(PermissionsData::IsRestrictedUrl( 126 EXPECT_FALSE(PermissionsData::IsRestrictedUrl(
120 self_url, extension, &error)) << name; 127 self_url, extension, &error)) << name;
121 EXPECT_TRUE(error.empty()) << name; 128 EXPECT_TRUE(error.empty()) << name;
122 129
123 // We should only allow other schemes for extensions when it's a whitelisted 130 // We should only allow other schemes for extensions when it's a whitelisted
124 // extension. 131 // extension.
125 error.clear(); 132 error.clear();
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
217 EXPECT_TRUE(hosts.MatchesURL(GURL("http://www.google.com"))); 224 EXPECT_TRUE(hosts.MatchesURL(GURL("http://www.google.com")));
218 EXPECT_TRUE(extension->permissions_data()->HasEffectiveAccessToAllHosts()); 225 EXPECT_TRUE(extension->permissions_data()->HasEffectiveAccessToAllHosts());
219 226
220 // Tab-specific permissions should be included in the effective hosts. 227 // Tab-specific permissions should be included in the effective hosts.
221 GURL tab_url("http://www.example.com/"); 228 GURL tab_url("http://www.example.com/");
222 URLPatternSet new_hosts; 229 URLPatternSet new_hosts;
223 new_hosts.AddOrigin(URLPattern::SCHEME_ALL, tab_url); 230 new_hosts.AddOrigin(URLPattern::SCHEME_ALL, tab_url);
224 extension->permissions_data()->UpdateTabSpecificPermissions( 231 extension->permissions_data()->UpdateTabSpecificPermissions(
225 1, PermissionSet(APIPermissionSet(), ManifestPermissionSet(), new_hosts, 232 1, PermissionSet(APIPermissionSet(), ManifestPermissionSet(), new_hosts,
226 URLPatternSet())); 233 URLPatternSet()));
227 EXPECT_TRUE(extension->permissions_data()->GetEffectiveHostPermissions(). 234 EXPECT_TRUE(
nrpeter 2017/04/05 23:13:26 I ran git cl format, and this happened.... Do yo
Devlin 2017/04/07 00:40:27 nah, git cl format changes are fine, as long as th
nrpeter 2017/04/12 23:35:45 Done.
228 MatchesURL(tab_url)); 235 extension->permissions_data()->GetEffectiveHostPermissions().MatchesURL(
236 tab_url));
229 extension->permissions_data()->ClearTabSpecificPermissions(1); 237 extension->permissions_data()->ClearTabSpecificPermissions(1);
230 EXPECT_FALSE(extension->permissions_data()->GetEffectiveHostPermissions(). 238 EXPECT_FALSE(
231 MatchesURL(tab_url)); 239 extension->permissions_data()->GetEffectiveHostPermissions().MatchesURL(
240 tab_url));
232 } 241 }
233 242
234 TEST(PermissionsDataTest, SocketPermissions) { 243 TEST(PermissionsDataTest, SocketPermissions) {
235 scoped_refptr<Extension> extension; 244 scoped_refptr<Extension> extension;
236 std::string error; 245 std::string error;
237 246
238 extension = LoadManifest("socket_permissions", "empty.json"); 247 extension = LoadManifest("socket_permissions", "empty.json");
239 EXPECT_FALSE(CheckSocketPermission(extension, 248 EXPECT_FALSE(CheckSocketPermission(
240 SocketPermissionRequest::TCP_CONNECT, "www.example.com", 80)); 249 extension, SocketPermissionRequest::TCP_CONNECT, "www.example.com", 80));
nrpeter 2017/04/05 23:13:27 Ditto
nrpeter 2017/04/12 23:35:45 Done.
241 250
242 extension = LoadManifestUnchecked("socket_permissions", 251 extension = LoadManifestUnchecked("socket_permissions",
243 "socket1.json", 252 "socket1.json",
244 Manifest::INTERNAL, Extension::NO_FLAGS, 253 Manifest::INTERNAL, Extension::NO_FLAGS,
245 &error); 254 &error);
246 EXPECT_TRUE(extension.get() == NULL); 255 EXPECT_TRUE(extension.get() == NULL);
247 std::string expected_error_msg_header = ErrorUtils::FormatErrorMessage( 256 std::string expected_error_msg_header = ErrorUtils::FormatErrorMessage(
248 manifest_errors::kInvalidPermissionWithDetail, 257 manifest_errors::kInvalidPermissionWithDetail,
249 "socket", 258 "socket",
250 "NULL or empty permission list"); 259 "NULL or empty permission list");
251 EXPECT_EQ(expected_error_msg_header, error); 260 EXPECT_EQ(expected_error_msg_header, error);
252 261
253 extension = LoadManifest("socket_permissions", "socket2.json"); 262 extension = LoadManifest("socket_permissions", "socket2.json");
254 EXPECT_TRUE(CheckSocketPermission(extension, 263 EXPECT_TRUE(CheckSocketPermission(
255 SocketPermissionRequest::TCP_CONNECT, "www.example.com", 80)); 264 extension, SocketPermissionRequest::TCP_CONNECT, "www.example.com", 80));
256 EXPECT_FALSE(CheckSocketPermission( 265 EXPECT_FALSE(CheckSocketPermission(
257 extension, SocketPermissionRequest::UDP_BIND, "", 80)); 266 extension, SocketPermissionRequest::UDP_BIND, "", 80));
258 EXPECT_TRUE(CheckSocketPermission( 267 EXPECT_TRUE(CheckSocketPermission(
259 extension, SocketPermissionRequest::UDP_BIND, "", 8888)); 268 extension, SocketPermissionRequest::UDP_BIND, "", 8888));
260 269
261 EXPECT_FALSE(CheckSocketPermission( 270 EXPECT_FALSE(CheckSocketPermission(
262 extension, SocketPermissionRequest::UDP_SEND_TO, "example.com", 1900)); 271 extension, SocketPermissionRequest::UDP_SEND_TO, "example.com", 1900));
263 EXPECT_TRUE(CheckSocketPermission( 272 EXPECT_TRUE(CheckSocketPermission(extension,
264 extension, 273 SocketPermissionRequest::UDP_SEND_TO,
265 SocketPermissionRequest::UDP_SEND_TO, 274 "239.255.255.250", 1900));
nrpeter 2017/04/05 23:13:27 Ditto
nrpeter 2017/04/12 23:35:45 Done.
266 "239.255.255.250", 1900));
267 } 275 }
268 276
269 TEST(PermissionsDataTest, IsRestrictedUrl) { 277 TEST(PermissionsDataTest, IsRestrictedUrl) {
270 scoped_refptr<const Extension> extension = 278 scoped_refptr<const Extension> extension =
271 GetExtensionWithHostPermission("normal_extension", 279 GetExtensionWithHostPermission("normal_extension",
272 kAllHostsPermission, 280 kAllHostsPermission,
273 Manifest::INTERNAL); 281 Manifest::INTERNAL);
274 // Chrome urls should be blocked for normal extensions. 282 // Chrome urls should be blocked for normal extensions, but not Google.
275 CheckRestrictedUrls(extension.get(), true); 283 CheckRestrictedUrls(extension.get(), true, false);
284
285 scoped_refptr<const Extension> policy_extension =
Devlin 2017/04/07 00:40:27 Let's make new tests for this. Unit tests are che
nrpeter 2017/04/12 23:35:44 Moved out of IsRestrictedUrl to this is no longer
286 GetExtensionWithHostPermission("policy_host_restriction_extension",
287 kAllHostsPermission, Manifest::INTERNAL);
288 URLPatternSet blocked;
289 URLPatternSet allowed;
290 blocked.AddPattern(
291 URLPattern(URLPattern::SCHEME_ALL, "https://*.google.com/*"));
292 policy_extension->permissions_data()->SetPolicyHostRestrictions(blocked,
293 allowed);
294 // Chrome urls should be blocked & Google urls should be blocked by policy.
295 CheckRestrictedUrls(policy_extension.get(), true, true);
276 296
277 scoped_refptr<const Extension> component = 297 scoped_refptr<const Extension> component =
278 GetExtensionWithHostPermission("component", 298 GetExtensionWithHostPermission("component",
279 kAllHostsPermission, 299 kAllHostsPermission,
280 Manifest::COMPONENT); 300 Manifest::COMPONENT);
281 // Chrome urls should be accessible by component extensions. 301 // Chrome urls should be accessible by component extensions.
282 CheckRestrictedUrls(component.get(), false); 302 CheckRestrictedUrls(component.get(), false, false);
303
304 scoped_refptr<const Extension> policy_component =
305 GetExtensionWithHostPermission("component", kAllHostsPermission,
306 Manifest::COMPONENT);
307 // Chrome urls should be accessible by component extensions & Google urls
308 // should be blocked by policy.
309 policy_component->permissions_data()->SetPolicyHostRestrictions(blocked,
310 allowed);
311 CheckRestrictedUrls(policy_component.get(), false, true);
283 312
284 base::CommandLine::ForCurrentProcess()->AppendSwitch( 313 base::CommandLine::ForCurrentProcess()->AppendSwitch(
285 switches::kExtensionsOnChromeURLs); 314 switches::kExtensionsOnChromeURLs);
286 // Enabling the switch should allow all extensions to access chrome urls. 315 // Enabling the switch should allow all extensions to access chrome urls.
287 CheckRestrictedUrls(extension.get(), false); 316 CheckRestrictedUrls(extension.get(), false, false);
288 } 317 }
289 318
290 TEST(PermissionsDataTest, GetPermissionMessages_ManyAPIPermissions) { 319 TEST(PermissionsDataTest, GetPermissionMessages_ManyAPIPermissions) {
291 scoped_refptr<Extension> extension; 320 scoped_refptr<Extension> extension;
292 extension = LoadManifest("permissions", "many-apis.json"); 321 extension = LoadManifest("permissions", "many-apis.json");
293 // Warning for "tabs" is suppressed by "history" permission. 322 // Warning for "tabs" is suppressed by "history" permission.
294 std::vector<std::string> expected_messages; 323 std::vector<std::string> expected_messages;
295 expected_messages.push_back("Read and change your data on api.flickr.com"); 324 expected_messages.push_back("Read and change your data on api.flickr.com");
296 expected_messages.push_back("Read and change your bookmarks"); 325 expected_messages.push_back("Read and change your bookmarks");
297 expected_messages.push_back("Detect your physical location"); 326 expected_messages.push_back("Detect your physical location");
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
374 } 403 }
375 404
376 // Base class for testing the CanAccessPage and CanCaptureVisiblePage 405 // Base class for testing the CanAccessPage and CanCaptureVisiblePage
377 // methods of Extension for extensions with various permissions. 406 // methods of Extension for extensions with various permissions.
378 class ExtensionScriptAndCaptureVisibleTest : public testing::Test { 407 class ExtensionScriptAndCaptureVisibleTest : public testing::Test {
379 protected: 408 protected:
380 ExtensionScriptAndCaptureVisibleTest() 409 ExtensionScriptAndCaptureVisibleTest()
381 : http_url("http://www.google.com"), 410 : http_url("http://www.google.com"),
382 http_url_with_path("http://www.google.com/index.html"), 411 http_url_with_path("http://www.google.com/index.html"),
383 https_url("https://www.google.com"), 412 https_url("https://www.google.com"),
413 https_url_diff_subdomain("https://example.google.com"),
384 file_url("file:///foo/bar"), 414 file_url("file:///foo/bar"),
385 favicon_url("chrome://favicon/http://www.google.com"), 415 favicon_url("chrome://favicon/http://www.google.com"),
386 extension_url("chrome-extension://" + 416 extension_url("chrome-extension://" +
387 crx_file::id_util::GenerateIdForPath( 417 crx_file::id_util::GenerateIdForPath(
388 base::FilePath(FILE_PATH_LITERAL("foo")))), 418 base::FilePath(FILE_PATH_LITERAL("foo")))),
389 settings_url("chrome://settings"), 419 settings_url("chrome://settings"),
390 about_url("about:flags") { 420 about_url("about:flags") {
391 urls_.insert(http_url); 421 urls_.insert(http_url);
392 urls_.insert(http_url_with_path); 422 urls_.insert(http_url_with_path);
393 urls_.insert(https_url); 423 urls_.insert(https_url);
424 urls_.insert(https_url_diff_subdomain);
394 urls_.insert(file_url); 425 urls_.insert(file_url);
395 urls_.insert(favicon_url); 426 urls_.insert(favicon_url);
396 urls_.insert(extension_url); 427 urls_.insert(extension_url);
397 urls_.insert(settings_url); 428 urls_.insert(settings_url);
398 urls_.insert(about_url); 429 urls_.insert(about_url);
399 // Ignore the policy delegate for this test. 430 // Ignore the policy delegate for this test.
400 PermissionsData::SetPolicyDelegate(NULL); 431 PermissionsData::SetPolicyDelegate(NULL);
401 } 432 }
402 433
403 bool AllowedScript(const Extension* extension, const GURL& url) { 434 bool AllowedScript(const Extension* extension, const GURL& url) {
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
469 result &= Blocked(extension, url, tab_id); 500 result &= Blocked(extension, url, tab_id);
470 } 501 }
471 return result; 502 return result;
472 } 503 }
473 504
474 // URLs that are "safe" to provide scripting and capture visible tab access 505 // URLs that are "safe" to provide scripting and capture visible tab access
475 // to if the permissions allow it. 506 // to if the permissions allow it.
476 const GURL http_url; 507 const GURL http_url;
477 const GURL http_url_with_path; 508 const GURL http_url_with_path;
478 const GURL https_url; 509 const GURL https_url;
510 const GURL https_url_diff_subdomain;
479 const GURL file_url; 511 const GURL file_url;
480 512
481 // We should allow host permission but not scripting permission for favicon 513 // We should allow host permission but not scripting permission for favicon
482 // urls. 514 // urls.
483 const GURL favicon_url; 515 const GURL favicon_url;
484 516
485 // URLs that regular extensions should never get access to. 517 // URLs that regular extensions should never get access to.
486 const GURL extension_url; 518 const GURL extension_url;
487 const GURL settings_url; 519 const GURL settings_url;
488 const GURL about_url; 520 const GURL about_url;
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
585 EXPECT_FALSE(extension->permissions_data()->HasHostPermission(settings_url)); 617 EXPECT_FALSE(extension->permissions_data()->HasHostPermission(settings_url));
586 } 618 }
587 619
588 TEST_F(ExtensionScriptAndCaptureVisibleTest, PermissionsWithChromeURLsEnabled) { 620 TEST_F(ExtensionScriptAndCaptureVisibleTest, PermissionsWithChromeURLsEnabled) {
589 base::CommandLine::ForCurrentProcess()->AppendSwitch( 621 base::CommandLine::ForCurrentProcess()->AppendSwitch(
590 switches::kExtensionsOnChromeURLs); 622 switches::kExtensionsOnChromeURLs);
591 623
592 scoped_refptr<Extension> extension; 624 scoped_refptr<Extension> extension;
593 625
594 // Test <all_urls> for regular extensions. 626 // Test <all_urls> for regular extensions.
595 extension = LoadManifestStrict("script_and_capture", 627 extension =
596 "extension_regular_all.json"); 628 LoadManifestStrict("script_and_capture", "extension_regular_all.json");
nrpeter 2017/04/05 23:13:27 Ditto
nrpeter 2017/04/12 23:35:44 Done.
597 EXPECT_TRUE(Allowed(extension.get(), http_url)); 629 EXPECT_TRUE(Allowed(extension.get(), http_url));
598 EXPECT_TRUE(Allowed(extension.get(), https_url)); 630 EXPECT_TRUE(Allowed(extension.get(), https_url));
599 EXPECT_TRUE(CaptureOnly(extension.get(), file_url)); 631 EXPECT_TRUE(CaptureOnly(extension.get(), file_url));
600 EXPECT_TRUE(CaptureOnly(extension.get(), settings_url)); 632 EXPECT_TRUE(CaptureOnly(extension.get(), settings_url));
601 EXPECT_TRUE(Allowed(extension.get(), favicon_url)); // chrome:// requested 633 EXPECT_TRUE(Allowed(extension.get(), favicon_url)); // chrome:// requested
602 EXPECT_TRUE(CaptureOnly(extension.get(), about_url)); 634 EXPECT_TRUE(CaptureOnly(extension.get(), about_url));
603 EXPECT_TRUE(CaptureOnly(extension.get(), extension_url)); 635 EXPECT_TRUE(CaptureOnly(extension.get(), extension_url));
604 636
605 // Test access to iframed content. 637 // Test access to iframed content.
606 GURL within_extension_url = extension->GetResourceURL("page.html"); 638 GURL within_extension_url = extension->GetResourceURL("page.html");
607 EXPECT_TRUE(AllowedScript(extension.get(), http_url)); 639 EXPECT_TRUE(AllowedScript(extension.get(), http_url));
608 EXPECT_TRUE(AllowedScript(extension.get(), http_url_with_path)); 640 EXPECT_TRUE(AllowedScript(extension.get(), http_url_with_path));
609 EXPECT_TRUE(AllowedScript(extension.get(), https_url)); 641 EXPECT_TRUE(AllowedScript(extension.get(), https_url));
610 EXPECT_TRUE(BlockedScript(extension.get(), within_extension_url)); 642 EXPECT_TRUE(BlockedScript(extension.get(), within_extension_url));
611 EXPECT_TRUE(BlockedScript(extension.get(), extension_url)); 643 EXPECT_TRUE(BlockedScript(extension.get(), extension_url));
612 644
613 const PermissionsData* permissions_data = extension->permissions_data(); 645 const PermissionsData* permissions_data = extension->permissions_data();
614 EXPECT_FALSE(permissions_data->HasHostPermission(settings_url)); 646 EXPECT_FALSE(permissions_data->HasHostPermission(settings_url));
615 EXPECT_FALSE(permissions_data->HasHostPermission(about_url)); 647 EXPECT_FALSE(permissions_data->HasHostPermission(about_url));
616 EXPECT_TRUE(permissions_data->HasHostPermission(favicon_url)); 648 EXPECT_TRUE(permissions_data->HasHostPermission(favicon_url));
617 649
618 // Test * for scheme, which implies just the http/https schemes. 650 // Test * for scheme, which implies just the http/https schemes.
619 extension = LoadManifestStrict("script_and_capture", 651 extension =
620 "extension_wildcard.json"); 652 LoadManifestStrict("script_and_capture", "extension_wildcard.json");
621 EXPECT_TRUE(ScriptOnly(extension.get(), http_url)); 653 EXPECT_TRUE(ScriptOnly(extension.get(), http_url));
622 EXPECT_TRUE(ScriptOnly(extension.get(), https_url)); 654 EXPECT_TRUE(ScriptOnly(extension.get(), https_url));
623 EXPECT_TRUE(Blocked(extension.get(), settings_url)); 655 EXPECT_TRUE(Blocked(extension.get(), settings_url));
624 EXPECT_TRUE(Blocked(extension.get(), about_url)); 656 EXPECT_TRUE(Blocked(extension.get(), about_url));
625 EXPECT_TRUE(Blocked(extension.get(), file_url)); 657 EXPECT_TRUE(Blocked(extension.get(), file_url));
626 EXPECT_TRUE(Blocked(extension.get(), favicon_url)); 658 EXPECT_TRUE(Blocked(extension.get(), favicon_url));
627 extension = 659 extension =
628 LoadManifest("script_and_capture", "extension_wildcard_settings.json"); 660 LoadManifest("script_and_capture", "extension_wildcard_settings.json");
629 EXPECT_TRUE(Blocked(extension.get(), settings_url)); 661 EXPECT_TRUE(Blocked(extension.get(), settings_url));
630 662
631 // Having chrome://*/ should work for regular extensions with the flag 663 // Having chrome://*/ should work for regular extensions with the flag
632 // enabled. 664 // enabled.
633 std::string error; 665 std::string error;
634 extension = LoadManifestUnchecked("script_and_capture", 666 extension = LoadManifestUnchecked("script_and_capture",
635 "extension_wildcard_chrome.json", 667 "extension_wildcard_chrome.json",
636 Manifest::INTERNAL, Extension::NO_FLAGS, 668 Manifest::INTERNAL, Extension::NO_FLAGS,
637 &error); 669 &error);
638 EXPECT_FALSE(extension.get() == NULL); 670 EXPECT_FALSE(extension.get() == NULL);
639 EXPECT_TRUE(Blocked(extension.get(), http_url)); 671 EXPECT_TRUE(Blocked(extension.get(), http_url));
640 EXPECT_TRUE(Blocked(extension.get(), https_url)); 672 EXPECT_TRUE(Blocked(extension.get(), https_url));
641 EXPECT_TRUE(ScriptOnly(extension.get(), settings_url)); 673 EXPECT_TRUE(ScriptOnly(extension.get(), settings_url));
642 EXPECT_TRUE(Blocked(extension.get(), about_url)); 674 EXPECT_TRUE(Blocked(extension.get(), about_url));
643 EXPECT_TRUE(Blocked(extension.get(), file_url)); 675 EXPECT_TRUE(Blocked(extension.get(), file_url));
644 EXPECT_TRUE(ScriptOnly(extension.get(), favicon_url)); 676 EXPECT_TRUE(ScriptOnly(extension.get(), favicon_url));
645 677
646 // Having chrome://favicon/* should not give you chrome://* 678 // Having chrome://favicon/* should not give you chrome://*
647 extension = LoadManifestStrict("script_and_capture", 679 extension = LoadManifestStrict("script_and_capture",
648 "extension_chrome_favicon_wildcard.json"); 680 "extension_chrome_favicon_wildcard.json");
649 EXPECT_TRUE(Blocked(extension.get(), settings_url)); 681 EXPECT_TRUE(Blocked(extension.get(), settings_url));
650 EXPECT_TRUE(ScriptOnly(extension.get(), favicon_url)); 682 EXPECT_TRUE(ScriptOnly(extension.get(), favicon_url));
651 EXPECT_TRUE(Blocked(extension.get(), about_url)); 683 EXPECT_TRUE(Blocked(extension.get(), about_url));
652 EXPECT_TRUE(extension->permissions_data()->HasHostPermission(favicon_url)); 684 EXPECT_TRUE(extension->permissions_data()->HasHostPermission(favicon_url));
653 685
654 // Having http://favicon should not give you chrome://favicon 686 // Having http://favicon should not give you chrome://favicon
655 extension = LoadManifestStrict("script_and_capture", 687 extension =
656 "extension_http_favicon.json"); 688 LoadManifestStrict("script_and_capture", "extension_http_favicon.json");
657 EXPECT_TRUE(Blocked(extension.get(), settings_url)); 689 EXPECT_TRUE(Blocked(extension.get(), settings_url));
658 EXPECT_TRUE(Blocked(extension.get(), favicon_url)); 690 EXPECT_TRUE(Blocked(extension.get(), favicon_url));
659 691
660 // Component extensions with <all_urls> should get everything. 692 // Component extensions with <all_urls> should get everything.
661 extension = LoadManifest("script_and_capture", "extension_component_all.json", 693 extension = LoadManifest("script_and_capture", "extension_component_all.json",
662 Manifest::COMPONENT, Extension::NO_FLAGS); 694 Manifest::COMPONENT, Extension::NO_FLAGS);
663 EXPECT_TRUE(Allowed(extension.get(), http_url)); 695 EXPECT_TRUE(Allowed(extension.get(), http_url));
664 EXPECT_TRUE(Allowed(extension.get(), https_url)); 696 EXPECT_TRUE(Allowed(extension.get(), https_url));
665 EXPECT_TRUE(Allowed(extension.get(), settings_url)); 697 EXPECT_TRUE(Allowed(extension.get(), settings_url));
666 EXPECT_TRUE(Allowed(extension.get(), about_url)); 698 EXPECT_TRUE(Allowed(extension.get(), about_url));
667 EXPECT_TRUE(Allowed(extension.get(), favicon_url)); 699 EXPECT_TRUE(Allowed(extension.get(), favicon_url));
668 EXPECT_TRUE(extension->permissions_data()->HasHostPermission(favicon_url)); 700 EXPECT_TRUE(extension->permissions_data()->HasHostPermission(favicon_url));
669 701
670 // Component extensions should only get access to what they ask for. 702 // Component extensions should only get access to what they ask for.
671 extension = LoadManifest("script_and_capture", 703 extension =
672 "extension_component_google.json", Manifest::COMPONENT, 704 LoadManifest("script_and_capture", "extension_component_google.json",
673 Extension::NO_FLAGS); 705 Manifest::COMPONENT, Extension::NO_FLAGS);
674 EXPECT_TRUE(ScriptOnly(extension.get(), http_url)); 706 EXPECT_TRUE(ScriptOnly(extension.get(), http_url));
675 EXPECT_TRUE(Blocked(extension.get(), https_url)); 707 EXPECT_TRUE(Blocked(extension.get(), https_url));
676 EXPECT_TRUE(Blocked(extension.get(), file_url)); 708 EXPECT_TRUE(Blocked(extension.get(), file_url));
677 EXPECT_TRUE(Blocked(extension.get(), settings_url)); 709 EXPECT_TRUE(Blocked(extension.get(), settings_url));
678 EXPECT_TRUE(Blocked(extension.get(), favicon_url)); 710 EXPECT_TRUE(Blocked(extension.get(), favicon_url));
679 EXPECT_TRUE(Blocked(extension.get(), about_url)); 711 EXPECT_TRUE(Blocked(extension.get(), about_url));
680 EXPECT_TRUE(Blocked(extension.get(), extension_url)); 712 EXPECT_TRUE(Blocked(extension.get(), extension_url));
681 EXPECT_FALSE(extension->permissions_data()->HasHostPermission(settings_url)); 713 EXPECT_FALSE(extension->permissions_data()->HasHostPermission(settings_url));
682 } 714 }
683 715
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
762 EXPECT_TRUE(ScriptAllowedExclusivelyOnTab(extension.get(), no_urls, 2)); 794 EXPECT_TRUE(ScriptAllowedExclusivelyOnTab(extension.get(), no_urls, 2));
763 795
764 permissions_data->ClearTabSpecificPermissions(1); 796 permissions_data->ClearTabSpecificPermissions(1);
765 EXPECT_FALSE(permissions_data->GetTabSpecificPermissionsForTesting(1)); 797 EXPECT_FALSE(permissions_data->GetTabSpecificPermissionsForTesting(1));
766 798
767 EXPECT_TRUE(ScriptAllowedExclusivelyOnTab(extension.get(), no_urls, 0)); 799 EXPECT_TRUE(ScriptAllowedExclusivelyOnTab(extension.get(), no_urls, 0));
768 EXPECT_TRUE(ScriptAllowedExclusivelyOnTab(extension.get(), no_urls, 1)); 800 EXPECT_TRUE(ScriptAllowedExclusivelyOnTab(extension.get(), no_urls, 1));
769 EXPECT_TRUE(ScriptAllowedExclusivelyOnTab(extension.get(), no_urls, 2)); 801 EXPECT_TRUE(ScriptAllowedExclusivelyOnTab(extension.get(), no_urls, 2));
770 } 802 }
771 803
804 TEST_F(ExtensionScriptAndCaptureVisibleTest, PolicyHostRestrictionsSwap) {
805 // Makes sure when an extension gets an individual policy for host
806 // restrictions it overrides the default policy. Also tests transitioning back
807 // to the default policy when an individual policy is removed.
808 URLPatternSet default_blocked;
809 URLPatternSet default_allowed;
810 default_blocked.AddPattern(
811 URLPattern(URLPattern::SCHEME_ALL, "https://*.google.com/*"));
812 default_allowed.AddPattern(
813 URLPattern(URLPattern::SCHEME_ALL, "https://example.google.com/*"));
814
815 // Test <all_urls> for regular extensions.
816 scoped_refptr<Extension> extension =
817 LoadManifestStrict("script_and_capture", "extension_regular_all.json");
818 extension->permissions_data()->SetDefaultPolicyHostRestrictions(
819 default_blocked, default_allowed);
820
821 // Default policy example.google.com OK, any other google subdomain blocked.
822 EXPECT_TRUE(CaptureOnly(extension.get(), https_url));
Devlin 2017/04/07 00:40:26 These variables (https_url, https_url_diff_subdoma
nrpeter 2017/04/12 23:35:45 Done.
823 EXPECT_TRUE(Allowed(extension.get(), https_url_diff_subdomain));
824
825 URLPatternSet blocked;
826 blocked.AddPattern(
827 URLPattern(URLPattern::SCHEME_ALL, "https://example.google.com/*"));
828 URLPatternSet allowed;
829 extension->permissions_data()->SetPolicyHostRestrictions(blocked, allowed);
830 // Individual poilcy example.google.com BLOCKED.
Devlin 2017/04/07 00:40:27 typo: policy
nrpeter 2017/04/12 23:35:45 Done.
nrpeter 2017/04/12 23:35:45 Done.
831 EXPECT_TRUE(Allowed(extension.get(), https_url));
832 EXPECT_TRUE(CaptureOnly(extension.get(), https_url_diff_subdomain));
833
834 // Individual policy example.google.com OK, other google subdomains blocked.
835 // Tests that URL is allowed if same URL in blocked and allowed.
Devlin 2017/04/07 00:40:27 Use proper grammar in comments, e.g. "Tests that a
nrpeter 2017/04/12 23:35:45 Done.
836 blocked.AddPattern(
837 URLPattern(URLPattern::SCHEME_ALL, "https://*.google.com/*"));
838 allowed.AddPattern(
839 URLPattern(URLPattern::SCHEME_ALL, "https://example.google.com/*"));
840 extension->permissions_data()->SetPolicyHostRestrictions(blocked, allowed);
841 EXPECT_TRUE(CaptureOnly(extension.get(), https_url));
842 EXPECT_TRUE(Allowed(extension.get(), https_url_diff_subdomain));
843
844 // Clear Individual plan.
845 blocked.ClearPatterns();
846 allowed.ClearPatterns();
847 extension->permissions_data()->SetPolicyHostRestrictions(blocked, allowed);
848 EXPECT_TRUE(Allowed(extension.get(), https_url));
849 EXPECT_TRUE(Allowed(extension.get(), https_url_diff_subdomain));
850
851 // Flip back to using default policy for this extension.
852 extension->permissions_data()->SetUsesDefaultHostRestrictions();
853
854 // Default policy example.google.com OK, any other google subdomain blocked.
855 EXPECT_TRUE(CaptureOnly(extension.get(), https_url));
856 EXPECT_TRUE(Allowed(extension.get(), https_url_diff_subdomain));
857 }
858
859 TEST_F(ExtensionScriptAndCaptureVisibleTest, PolicyHostRestrictions) {
860 URLPatternSet default_blocked;
861 URLPatternSet default_allowed;
862 default_blocked.AddPattern(
863 URLPattern(URLPattern::SCHEME_ALL, "https://*.google.com/*"));
864 default_allowed.AddPattern(
865 URLPattern(URLPattern::SCHEME_ALL, "https://example.google.com/*"));
866
867 // Test <all_urls> for regular extensions.
868 scoped_refptr<Extension> extension =
869 LoadManifestStrict("script_and_capture", "extension_regular_all.json");
870 extension->permissions_data()->SetDefaultPolicyHostRestrictions(
871 default_blocked, default_allowed);
872
873 EXPECT_TRUE(Allowed(extension.get(), http_url));
874 EXPECT_TRUE(CaptureOnly(extension.get(), https_url));
875 EXPECT_TRUE(Allowed(extension.get(), https_url_diff_subdomain));
876 EXPECT_TRUE(CaptureOnly(extension.get(), file_url));
877 EXPECT_TRUE(CaptureOnly(extension.get(), settings_url));
878 EXPECT_TRUE(CaptureOnly(extension.get(), favicon_url));
879 EXPECT_TRUE(CaptureOnly(extension.get(), about_url));
880 EXPECT_TRUE(CaptureOnly(extension.get(), extension_url));
881
882 // Test access to iframed content.
883 GURL within_extension_url = extension->GetResourceURL("page.html");
884 EXPECT_TRUE(AllowedScript(extension.get(), http_url));
885 EXPECT_TRUE(AllowedScript(extension.get(), http_url_with_path));
886 EXPECT_TRUE(AllowedScript(extension.get(), https_url_diff_subdomain));
887 EXPECT_TRUE(BlockedScript(extension.get(), https_url));
888 EXPECT_TRUE(BlockedScript(extension.get(), within_extension_url));
889 EXPECT_TRUE(BlockedScript(extension.get(), extension_url));
890
891 EXPECT_FALSE(extension->permissions_data()->HasHostPermission(settings_url));
892 EXPECT_FALSE(extension->permissions_data()->HasHostPermission(about_url));
893 EXPECT_TRUE(extension->permissions_data()->HasHostPermission(favicon_url));
894
895 // Test * for scheme, which implies just the http/https schemes.
896 extension =
897 LoadManifestStrict("script_and_capture", "extension_wildcard.json");
898 extension->permissions_data()->SetDefaultPolicyHostRestrictions(
899 default_blocked, default_allowed);
900 EXPECT_TRUE(ScriptOnly(extension.get(), http_url));
901 EXPECT_TRUE(ScriptOnly(extension.get(), https_url_diff_subdomain));
902 EXPECT_TRUE(Blocked(extension.get(), https_url));
903 EXPECT_TRUE(Blocked(extension.get(), settings_url));
904 EXPECT_TRUE(Blocked(extension.get(), about_url));
905 EXPECT_TRUE(Blocked(extension.get(), file_url));
906 EXPECT_TRUE(Blocked(extension.get(), favicon_url));
907 extension =
908 LoadManifest("script_and_capture", "extension_wildcard_settings.json");
909 extension->permissions_data()->SetDefaultPolicyHostRestrictions(
910 default_blocked, default_allowed);
911 EXPECT_TRUE(Blocked(extension.get(), settings_url));
912
913 // Having chrome://*/ should not work for regular extensions. Note that
914 // for favicon access, we require the explicit pattern chrome://favicon/*.
915 std::string error;
916 extension = LoadManifestUnchecked(
917 "script_and_capture", "extension_wildcard_chrome.json",
918 Manifest::INTERNAL, Extension::NO_FLAGS, &error);
919 extension->permissions_data()->SetDefaultPolicyHostRestrictions(
920 default_blocked, default_allowed);
921 std::vector<InstallWarning> warnings = extension->install_warnings();
922 EXPECT_FALSE(warnings.empty());
923 EXPECT_EQ(ErrorUtils::FormatErrorMessage(
924 manifest_errors::kInvalidPermissionScheme, "chrome://*/"),
925 warnings[0].message);
926 EXPECT_TRUE(Blocked(extension.get(), settings_url));
927 EXPECT_TRUE(Blocked(extension.get(), favicon_url));
928 EXPECT_TRUE(Blocked(extension.get(), about_url));
929
930 // Having chrome://favicon/* should not give you chrome://*
Devlin 2017/04/07 00:40:27 A lot of this test seems duplicative. Can we eith
nrpeter 2017/04/12 23:35:45 Good point, all the tests after the component test
931 extension = LoadManifestStrict("script_and_capture",
932 "extension_chrome_favicon_wildcard.json");
933 extension->permissions_data()->SetDefaultPolicyHostRestrictions(
934 default_blocked, default_allowed);
935 EXPECT_TRUE(Blocked(extension.get(), settings_url));
936 EXPECT_TRUE(Blocked(extension.get(), favicon_url));
937 EXPECT_TRUE(Blocked(extension.get(), about_url));
938 EXPECT_TRUE(extension->permissions_data()->HasHostPermission(favicon_url));
939
940 // Having http://favicon should not give you chrome://favicon
941 extension =
942 LoadManifestStrict("script_and_capture", "extension_http_favicon.json");
943 extension->permissions_data()->SetDefaultPolicyHostRestrictions(
944 default_blocked, default_allowed);
945 EXPECT_TRUE(Blocked(extension.get(), settings_url));
946 EXPECT_TRUE(Blocked(extension.get(), favicon_url));
947
948 // Component extensions with <all_urls> should get everything.
949 extension = LoadManifest("script_and_capture", "extension_component_all.json",
950 Manifest::COMPONENT, Extension::NO_FLAGS);
951 extension->permissions_data()->SetDefaultPolicyHostRestrictions(
952 default_blocked, default_allowed);
953 EXPECT_TRUE(Allowed(extension.get(), http_url));
954 EXPECT_TRUE(CaptureOnly(extension.get(), https_url));
955 EXPECT_TRUE(Allowed(extension.get(), https_url_diff_subdomain));
956 EXPECT_TRUE(Allowed(extension.get(), settings_url));
957 EXPECT_TRUE(Allowed(extension.get(), about_url));
958 EXPECT_TRUE(Allowed(extension.get(), favicon_url));
959 EXPECT_TRUE(extension->permissions_data()->HasHostPermission(favicon_url));
960
961 // Component extensions should only get access to what they ask for.
962 extension =
963 LoadManifest("script_and_capture", "extension_component_google.json",
964 Manifest::COMPONENT, Extension::NO_FLAGS);
965 extension->permissions_data()->SetDefaultPolicyHostRestrictions(
966 default_blocked, default_allowed);
967 EXPECT_TRUE(ScriptOnly(extension.get(), http_url));
968 EXPECT_TRUE(Blocked(extension.get(), https_url));
969 EXPECT_TRUE(Blocked(extension.get(), https_url_diff_subdomain));
970 EXPECT_TRUE(Blocked(extension.get(), file_url));
971 EXPECT_TRUE(Blocked(extension.get(), settings_url));
972 EXPECT_TRUE(Blocked(extension.get(), favicon_url));
973 EXPECT_TRUE(Blocked(extension.get(), about_url));
974 EXPECT_TRUE(Blocked(extension.get(), extension_url));
975 EXPECT_FALSE(extension->permissions_data()->HasHostPermission(settings_url));
976 }
977
772 } // namespace extensions 978 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698