OLD | NEW |
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 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
217 EXPECT_TRUE(hosts.MatchesURL(GURL("http://www.google.com"))); | 218 EXPECT_TRUE(hosts.MatchesURL(GURL("http://www.google.com"))); |
218 EXPECT_TRUE(extension->permissions_data()->HasEffectiveAccessToAllHosts()); | 219 EXPECT_TRUE(extension->permissions_data()->HasEffectiveAccessToAllHosts()); |
219 | 220 |
220 // Tab-specific permissions should be included in the effective hosts. | 221 // Tab-specific permissions should be included in the effective hosts. |
221 GURL tab_url("http://www.example.com/"); | 222 GURL tab_url("http://www.example.com/"); |
222 URLPatternSet new_hosts; | 223 URLPatternSet new_hosts; |
223 new_hosts.AddOrigin(URLPattern::SCHEME_ALL, tab_url); | 224 new_hosts.AddOrigin(URLPattern::SCHEME_ALL, tab_url); |
224 extension->permissions_data()->UpdateTabSpecificPermissions( | 225 extension->permissions_data()->UpdateTabSpecificPermissions( |
225 1, PermissionSet(APIPermissionSet(), ManifestPermissionSet(), new_hosts, | 226 1, PermissionSet(APIPermissionSet(), ManifestPermissionSet(), new_hosts, |
226 URLPatternSet())); | 227 URLPatternSet())); |
227 EXPECT_TRUE(extension->permissions_data()->GetEffectiveHostPermissions(). | 228 EXPECT_TRUE( |
228 MatchesURL(tab_url)); | 229 extension->permissions_data()->GetEffectiveHostPermissions().MatchesURL( |
| 230 tab_url)); |
229 extension->permissions_data()->ClearTabSpecificPermissions(1); | 231 extension->permissions_data()->ClearTabSpecificPermissions(1); |
230 EXPECT_FALSE(extension->permissions_data()->GetEffectiveHostPermissions(). | 232 EXPECT_FALSE( |
231 MatchesURL(tab_url)); | 233 extension->permissions_data()->GetEffectiveHostPermissions().MatchesURL( |
| 234 tab_url)); |
232 } | 235 } |
233 | 236 |
234 TEST(PermissionsDataTest, SocketPermissions) { | 237 TEST(PermissionsDataTest, SocketPermissions) { |
235 scoped_refptr<Extension> extension; | 238 scoped_refptr<Extension> extension; |
236 std::string error; | 239 std::string error; |
237 | 240 |
238 extension = LoadManifest("socket_permissions", "empty.json"); | 241 extension = LoadManifest("socket_permissions", "empty.json"); |
239 EXPECT_FALSE(CheckSocketPermission(extension, | 242 EXPECT_FALSE(CheckSocketPermission( |
240 SocketPermissionRequest::TCP_CONNECT, "www.example.com", 80)); | 243 extension, SocketPermissionRequest::TCP_CONNECT, "www.example.com", 80)); |
241 | 244 |
242 extension = LoadManifestUnchecked("socket_permissions", | 245 extension = LoadManifestUnchecked("socket_permissions", |
243 "socket1.json", | 246 "socket1.json", |
244 Manifest::INTERNAL, Extension::NO_FLAGS, | 247 Manifest::INTERNAL, Extension::NO_FLAGS, |
245 &error); | 248 &error); |
246 EXPECT_TRUE(extension.get() == NULL); | 249 EXPECT_TRUE(extension.get() == NULL); |
247 std::string expected_error_msg_header = ErrorUtils::FormatErrorMessage( | 250 std::string expected_error_msg_header = ErrorUtils::FormatErrorMessage( |
248 manifest_errors::kInvalidPermissionWithDetail, | 251 manifest_errors::kInvalidPermissionWithDetail, |
249 "socket", | 252 "socket", |
250 "NULL or empty permission list"); | 253 "NULL or empty permission list"); |
251 EXPECT_EQ(expected_error_msg_header, error); | 254 EXPECT_EQ(expected_error_msg_header, error); |
252 | 255 |
253 extension = LoadManifest("socket_permissions", "socket2.json"); | 256 extension = LoadManifest("socket_permissions", "socket2.json"); |
254 EXPECT_TRUE(CheckSocketPermission(extension, | 257 EXPECT_TRUE(CheckSocketPermission( |
255 SocketPermissionRequest::TCP_CONNECT, "www.example.com", 80)); | 258 extension, SocketPermissionRequest::TCP_CONNECT, "www.example.com", 80)); |
256 EXPECT_FALSE(CheckSocketPermission( | 259 EXPECT_FALSE(CheckSocketPermission( |
257 extension, SocketPermissionRequest::UDP_BIND, "", 80)); | 260 extension, SocketPermissionRequest::UDP_BIND, "", 80)); |
258 EXPECT_TRUE(CheckSocketPermission( | 261 EXPECT_TRUE(CheckSocketPermission( |
259 extension, SocketPermissionRequest::UDP_BIND, "", 8888)); | 262 extension, SocketPermissionRequest::UDP_BIND, "", 8888)); |
260 | 263 |
261 EXPECT_FALSE(CheckSocketPermission( | 264 EXPECT_FALSE(CheckSocketPermission( |
262 extension, SocketPermissionRequest::UDP_SEND_TO, "example.com", 1900)); | 265 extension, SocketPermissionRequest::UDP_SEND_TO, "example.com", 1900)); |
263 EXPECT_TRUE(CheckSocketPermission( | 266 EXPECT_TRUE(CheckSocketPermission(extension, |
264 extension, | 267 SocketPermissionRequest::UDP_SEND_TO, |
265 SocketPermissionRequest::UDP_SEND_TO, | 268 "239.255.255.250", 1900)); |
266 "239.255.255.250", 1900)); | |
267 } | 269 } |
268 | 270 |
269 TEST(PermissionsDataTest, IsRestrictedUrl) { | 271 TEST(PermissionsDataTest, IsRestrictedUrl) { |
270 scoped_refptr<const Extension> extension = | 272 scoped_refptr<const Extension> extension = |
271 GetExtensionWithHostPermission("normal_extension", | 273 GetExtensionWithHostPermission("normal_extension", |
272 kAllHostsPermission, | 274 kAllHostsPermission, |
273 Manifest::INTERNAL); | 275 Manifest::INTERNAL); |
274 // Chrome urls should be blocked for normal extensions. | 276 // Chrome urls should be blocked for normal extensions. |
275 CheckRestrictedUrls(extension.get(), true); | 277 CheckRestrictedUrls(extension.get(), true); |
276 | 278 |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
374 } | 376 } |
375 | 377 |
376 // Base class for testing the CanAccessPage and CanCaptureVisiblePage | 378 // Base class for testing the CanAccessPage and CanCaptureVisiblePage |
377 // methods of Extension for extensions with various permissions. | 379 // methods of Extension for extensions with various permissions. |
378 class ExtensionScriptAndCaptureVisibleTest : public testing::Test { | 380 class ExtensionScriptAndCaptureVisibleTest : public testing::Test { |
379 protected: | 381 protected: |
380 ExtensionScriptAndCaptureVisibleTest() | 382 ExtensionScriptAndCaptureVisibleTest() |
381 : http_url("http://www.google.com"), | 383 : http_url("http://www.google.com"), |
382 http_url_with_path("http://www.google.com/index.html"), | 384 http_url_with_path("http://www.google.com/index.html"), |
383 https_url("https://www.google.com"), | 385 https_url("https://www.google.com"), |
| 386 example_com("https://example.com"), |
| 387 test_example_com("https://test.example.com"), |
| 388 sample_example_com("https://sample.example.com"), |
384 file_url("file:///foo/bar"), | 389 file_url("file:///foo/bar"), |
385 favicon_url("chrome://favicon/http://www.google.com"), | 390 favicon_url("chrome://favicon/http://www.google.com"), |
386 extension_url("chrome-extension://" + | 391 extension_url("chrome-extension://" + |
387 crx_file::id_util::GenerateIdForPath( | 392 crx_file::id_util::GenerateIdForPath( |
388 base::FilePath(FILE_PATH_LITERAL("foo")))), | 393 base::FilePath(FILE_PATH_LITERAL("foo")))), |
389 settings_url("chrome://settings"), | 394 settings_url("chrome://settings"), |
390 about_url("about:flags") { | 395 about_url("about:flags") { |
391 urls_.insert(http_url); | 396 urls_.insert(http_url); |
392 urls_.insert(http_url_with_path); | 397 urls_.insert(http_url_with_path); |
393 urls_.insert(https_url); | 398 urls_.insert(https_url); |
| 399 urls_.insert(example_com); |
| 400 urls_.insert(test_example_com); |
| 401 urls_.insert(sample_example_com); |
394 urls_.insert(file_url); | 402 urls_.insert(file_url); |
395 urls_.insert(favicon_url); | 403 urls_.insert(favicon_url); |
396 urls_.insert(extension_url); | 404 urls_.insert(extension_url); |
397 urls_.insert(settings_url); | 405 urls_.insert(settings_url); |
398 urls_.insert(about_url); | 406 urls_.insert(about_url); |
399 // Ignore the policy delegate for this test. | 407 // Ignore the policy delegate for this test. |
400 PermissionsData::SetPolicyDelegate(NULL); | 408 PermissionsData::SetPolicyDelegate(NULL); |
401 } | 409 } |
402 | 410 |
403 bool AllowedScript(const Extension* extension, const GURL& url) { | 411 bool AllowedScript(const Extension* extension, const GURL& url) { |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
469 result &= Blocked(extension, url, tab_id); | 477 result &= Blocked(extension, url, tab_id); |
470 } | 478 } |
471 return result; | 479 return result; |
472 } | 480 } |
473 | 481 |
474 // URLs that are "safe" to provide scripting and capture visible tab access | 482 // URLs that are "safe" to provide scripting and capture visible tab access |
475 // to if the permissions allow it. | 483 // to if the permissions allow it. |
476 const GURL http_url; | 484 const GURL http_url; |
477 const GURL http_url_with_path; | 485 const GURL http_url_with_path; |
478 const GURL https_url; | 486 const GURL https_url; |
| 487 const GURL example_com; |
| 488 const GURL test_example_com; |
| 489 const GURL sample_example_com; |
479 const GURL file_url; | 490 const GURL file_url; |
480 | 491 |
481 // We should allow host permission but not scripting permission for favicon | 492 // We should allow host permission but not scripting permission for favicon |
482 // urls. | 493 // urls. |
483 const GURL favicon_url; | 494 const GURL favicon_url; |
484 | 495 |
485 // URLs that regular extensions should never get access to. | 496 // URLs that regular extensions should never get access to. |
486 const GURL extension_url; | 497 const GURL extension_url; |
487 const GURL settings_url; | 498 const GURL settings_url; |
488 const GURL about_url; | 499 const GURL about_url; |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
585 EXPECT_FALSE(extension->permissions_data()->HasHostPermission(settings_url)); | 596 EXPECT_FALSE(extension->permissions_data()->HasHostPermission(settings_url)); |
586 } | 597 } |
587 | 598 |
588 TEST_F(ExtensionScriptAndCaptureVisibleTest, PermissionsWithChromeURLsEnabled) { | 599 TEST_F(ExtensionScriptAndCaptureVisibleTest, PermissionsWithChromeURLsEnabled) { |
589 base::CommandLine::ForCurrentProcess()->AppendSwitch( | 600 base::CommandLine::ForCurrentProcess()->AppendSwitch( |
590 switches::kExtensionsOnChromeURLs); | 601 switches::kExtensionsOnChromeURLs); |
591 | 602 |
592 scoped_refptr<Extension> extension; | 603 scoped_refptr<Extension> extension; |
593 | 604 |
594 // Test <all_urls> for regular extensions. | 605 // Test <all_urls> for regular extensions. |
595 extension = LoadManifestStrict("script_and_capture", | 606 extension = |
596 "extension_regular_all.json"); | 607 LoadManifestStrict("script_and_capture", "extension_regular_all.json"); |
597 EXPECT_TRUE(Allowed(extension.get(), http_url)); | 608 EXPECT_TRUE(Allowed(extension.get(), http_url)); |
598 EXPECT_TRUE(Allowed(extension.get(), https_url)); | 609 EXPECT_TRUE(Allowed(extension.get(), https_url)); |
599 EXPECT_TRUE(CaptureOnly(extension.get(), file_url)); | 610 EXPECT_TRUE(CaptureOnly(extension.get(), file_url)); |
600 EXPECT_TRUE(CaptureOnly(extension.get(), settings_url)); | 611 EXPECT_TRUE(CaptureOnly(extension.get(), settings_url)); |
601 EXPECT_TRUE(Allowed(extension.get(), favicon_url)); // chrome:// requested | 612 EXPECT_TRUE(Allowed(extension.get(), favicon_url)); // chrome:// requested |
602 EXPECT_TRUE(CaptureOnly(extension.get(), about_url)); | 613 EXPECT_TRUE(CaptureOnly(extension.get(), about_url)); |
603 EXPECT_TRUE(CaptureOnly(extension.get(), extension_url)); | 614 EXPECT_TRUE(CaptureOnly(extension.get(), extension_url)); |
604 | 615 |
605 // Test access to iframed content. | 616 // Test access to iframed content. |
606 GURL within_extension_url = extension->GetResourceURL("page.html"); | 617 GURL within_extension_url = extension->GetResourceURL("page.html"); |
607 EXPECT_TRUE(AllowedScript(extension.get(), http_url)); | 618 EXPECT_TRUE(AllowedScript(extension.get(), http_url)); |
608 EXPECT_TRUE(AllowedScript(extension.get(), http_url_with_path)); | 619 EXPECT_TRUE(AllowedScript(extension.get(), http_url_with_path)); |
609 EXPECT_TRUE(AllowedScript(extension.get(), https_url)); | 620 EXPECT_TRUE(AllowedScript(extension.get(), https_url)); |
610 EXPECT_TRUE(BlockedScript(extension.get(), within_extension_url)); | 621 EXPECT_TRUE(BlockedScript(extension.get(), within_extension_url)); |
611 EXPECT_TRUE(BlockedScript(extension.get(), extension_url)); | 622 EXPECT_TRUE(BlockedScript(extension.get(), extension_url)); |
612 | 623 |
613 const PermissionsData* permissions_data = extension->permissions_data(); | 624 const PermissionsData* permissions_data = extension->permissions_data(); |
614 EXPECT_FALSE(permissions_data->HasHostPermission(settings_url)); | 625 EXPECT_FALSE(permissions_data->HasHostPermission(settings_url)); |
615 EXPECT_FALSE(permissions_data->HasHostPermission(about_url)); | 626 EXPECT_FALSE(permissions_data->HasHostPermission(about_url)); |
616 EXPECT_TRUE(permissions_data->HasHostPermission(favicon_url)); | 627 EXPECT_TRUE(permissions_data->HasHostPermission(favicon_url)); |
617 | 628 |
618 // Test * for scheme, which implies just the http/https schemes. | 629 // Test * for scheme, which implies just the http/https schemes. |
619 extension = LoadManifestStrict("script_and_capture", | 630 extension = |
620 "extension_wildcard.json"); | 631 LoadManifestStrict("script_and_capture", "extension_wildcard.json"); |
621 EXPECT_TRUE(ScriptOnly(extension.get(), http_url)); | 632 EXPECT_TRUE(ScriptOnly(extension.get(), http_url)); |
622 EXPECT_TRUE(ScriptOnly(extension.get(), https_url)); | 633 EXPECT_TRUE(ScriptOnly(extension.get(), https_url)); |
623 EXPECT_TRUE(Blocked(extension.get(), settings_url)); | 634 EXPECT_TRUE(Blocked(extension.get(), settings_url)); |
624 EXPECT_TRUE(Blocked(extension.get(), about_url)); | 635 EXPECT_TRUE(Blocked(extension.get(), about_url)); |
625 EXPECT_TRUE(Blocked(extension.get(), file_url)); | 636 EXPECT_TRUE(Blocked(extension.get(), file_url)); |
626 EXPECT_TRUE(Blocked(extension.get(), favicon_url)); | 637 EXPECT_TRUE(Blocked(extension.get(), favicon_url)); |
627 extension = | 638 extension = |
628 LoadManifest("script_and_capture", "extension_wildcard_settings.json"); | 639 LoadManifest("script_and_capture", "extension_wildcard_settings.json"); |
629 EXPECT_TRUE(Blocked(extension.get(), settings_url)); | 640 EXPECT_TRUE(Blocked(extension.get(), settings_url)); |
630 | 641 |
631 // Having chrome://*/ should work for regular extensions with the flag | 642 // Having chrome://*/ should work for regular extensions with the flag |
632 // enabled. | 643 // enabled. |
633 std::string error; | 644 std::string error; |
634 extension = LoadManifestUnchecked("script_and_capture", | 645 extension = LoadManifestUnchecked("script_and_capture", |
635 "extension_wildcard_chrome.json", | 646 "extension_wildcard_chrome.json", |
636 Manifest::INTERNAL, Extension::NO_FLAGS, | 647 Manifest::INTERNAL, Extension::NO_FLAGS, |
637 &error); | 648 &error); |
638 EXPECT_FALSE(extension.get() == NULL); | 649 EXPECT_FALSE(extension.get() == NULL); |
639 EXPECT_TRUE(Blocked(extension.get(), http_url)); | 650 EXPECT_TRUE(Blocked(extension.get(), http_url)); |
640 EXPECT_TRUE(Blocked(extension.get(), https_url)); | 651 EXPECT_TRUE(Blocked(extension.get(), https_url)); |
641 EXPECT_TRUE(ScriptOnly(extension.get(), settings_url)); | 652 EXPECT_TRUE(ScriptOnly(extension.get(), settings_url)); |
642 EXPECT_TRUE(Blocked(extension.get(), about_url)); | 653 EXPECT_TRUE(Blocked(extension.get(), about_url)); |
643 EXPECT_TRUE(Blocked(extension.get(), file_url)); | 654 EXPECT_TRUE(Blocked(extension.get(), file_url)); |
644 EXPECT_TRUE(ScriptOnly(extension.get(), favicon_url)); | 655 EXPECT_TRUE(ScriptOnly(extension.get(), favicon_url)); |
645 | 656 |
646 // Having chrome://favicon/* should not give you chrome://* | 657 // Having chrome://favicon/* should not give you chrome://* |
647 extension = LoadManifestStrict("script_and_capture", | 658 extension = LoadManifestStrict("script_and_capture", |
648 "extension_chrome_favicon_wildcard.json"); | 659 "extension_chrome_favicon_wildcard.json"); |
649 EXPECT_TRUE(Blocked(extension.get(), settings_url)); | 660 EXPECT_TRUE(Blocked(extension.get(), settings_url)); |
650 EXPECT_TRUE(ScriptOnly(extension.get(), favicon_url)); | 661 EXPECT_TRUE(ScriptOnly(extension.get(), favicon_url)); |
651 EXPECT_TRUE(Blocked(extension.get(), about_url)); | 662 EXPECT_TRUE(Blocked(extension.get(), about_url)); |
652 EXPECT_TRUE(extension->permissions_data()->HasHostPermission(favicon_url)); | 663 EXPECT_TRUE(extension->permissions_data()->HasHostPermission(favicon_url)); |
653 | 664 |
654 // Having http://favicon should not give you chrome://favicon | 665 // Having http://favicon should not give you chrome://favicon |
655 extension = LoadManifestStrict("script_and_capture", | 666 extension = |
656 "extension_http_favicon.json"); | 667 LoadManifestStrict("script_and_capture", "extension_http_favicon.json"); |
657 EXPECT_TRUE(Blocked(extension.get(), settings_url)); | 668 EXPECT_TRUE(Blocked(extension.get(), settings_url)); |
658 EXPECT_TRUE(Blocked(extension.get(), favicon_url)); | 669 EXPECT_TRUE(Blocked(extension.get(), favicon_url)); |
659 | 670 |
660 // Component extensions with <all_urls> should get everything. | 671 // Component extensions with <all_urls> should get everything. |
661 extension = LoadManifest("script_and_capture", "extension_component_all.json", | 672 extension = LoadManifest("script_and_capture", "extension_component_all.json", |
662 Manifest::COMPONENT, Extension::NO_FLAGS); | 673 Manifest::COMPONENT, Extension::NO_FLAGS); |
663 EXPECT_TRUE(Allowed(extension.get(), http_url)); | 674 EXPECT_TRUE(Allowed(extension.get(), http_url)); |
664 EXPECT_TRUE(Allowed(extension.get(), https_url)); | 675 EXPECT_TRUE(Allowed(extension.get(), https_url)); |
665 EXPECT_TRUE(Allowed(extension.get(), settings_url)); | 676 EXPECT_TRUE(Allowed(extension.get(), settings_url)); |
666 EXPECT_TRUE(Allowed(extension.get(), about_url)); | 677 EXPECT_TRUE(Allowed(extension.get(), about_url)); |
667 EXPECT_TRUE(Allowed(extension.get(), favicon_url)); | 678 EXPECT_TRUE(Allowed(extension.get(), favicon_url)); |
668 EXPECT_TRUE(extension->permissions_data()->HasHostPermission(favicon_url)); | 679 EXPECT_TRUE(extension->permissions_data()->HasHostPermission(favicon_url)); |
669 | 680 |
670 // Component extensions should only get access to what they ask for. | 681 // Component extensions should only get access to what they ask for. |
671 extension = LoadManifest("script_and_capture", | 682 extension = |
672 "extension_component_google.json", Manifest::COMPONENT, | 683 LoadManifest("script_and_capture", "extension_component_google.json", |
673 Extension::NO_FLAGS); | 684 Manifest::COMPONENT, Extension::NO_FLAGS); |
674 EXPECT_TRUE(ScriptOnly(extension.get(), http_url)); | 685 EXPECT_TRUE(ScriptOnly(extension.get(), http_url)); |
675 EXPECT_TRUE(Blocked(extension.get(), https_url)); | 686 EXPECT_TRUE(Blocked(extension.get(), https_url)); |
676 EXPECT_TRUE(Blocked(extension.get(), file_url)); | 687 EXPECT_TRUE(Blocked(extension.get(), file_url)); |
677 EXPECT_TRUE(Blocked(extension.get(), settings_url)); | 688 EXPECT_TRUE(Blocked(extension.get(), settings_url)); |
678 EXPECT_TRUE(Blocked(extension.get(), favicon_url)); | 689 EXPECT_TRUE(Blocked(extension.get(), favicon_url)); |
679 EXPECT_TRUE(Blocked(extension.get(), about_url)); | 690 EXPECT_TRUE(Blocked(extension.get(), about_url)); |
680 EXPECT_TRUE(Blocked(extension.get(), extension_url)); | 691 EXPECT_TRUE(Blocked(extension.get(), extension_url)); |
681 EXPECT_FALSE(extension->permissions_data()->HasHostPermission(settings_url)); | 692 EXPECT_FALSE(extension->permissions_data()->HasHostPermission(settings_url)); |
682 } | 693 } |
683 | 694 |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
825 kTabId, &error)) | 836 kTabId, &error)) |
826 << extension->name() << ": " << url; | 837 << extension->name() << ": " << url; |
827 EXPECT_EQ(PermissionsData::ACCESS_DENIED, | 838 EXPECT_EQ(PermissionsData::ACCESS_DENIED, |
828 extension->permissions_data()->GetContentScriptAccess( | 839 extension->permissions_data()->GetContentScriptAccess( |
829 extension, url, kTabId, &error)) | 840 extension, url, kTabId, &error)) |
830 << extension->name() << ": " << url; | 841 << extension->name() << ": " << url; |
831 } | 842 } |
832 } | 843 } |
833 } | 844 } |
834 | 845 |
| 846 TEST_F(ExtensionScriptAndCaptureVisibleTest, PolicyHostRestrictionsSwap) { |
| 847 // Makes sure when an extension gets an individual policy for host |
| 848 // restrictions it overrides the default policy. Also tests transitioning back |
| 849 // to the default policy when an individual policy is removed. |
| 850 URLPattern example_com_pattern = |
| 851 URLPattern(URLPattern::SCHEME_ALL, "*://*.example.com/*"); |
| 852 URLPattern test_example_com_pattern = |
| 853 URLPattern(URLPattern::SCHEME_ALL, "*://test.example.com/*"); |
| 854 URLPatternSet default_blocked; |
| 855 URLPatternSet default_allowed; |
| 856 default_blocked.AddPattern(example_com_pattern); |
| 857 default_allowed.AddPattern(test_example_com_pattern); |
| 858 |
| 859 // Test <all_urls> for regular extensions. |
| 860 scoped_refptr<Extension> extension = |
| 861 LoadManifestStrict("script_and_capture", "extension_regular_all.json"); |
| 862 extension->permissions_data()->SetDefaultPolicyHostRestrictions( |
| 863 default_blocked, default_allowed); |
| 864 |
| 865 // The default policy applies to all extensions at this point. The extension |
| 866 // should be able to access test.example.com but be blocked from |
| 867 // accessing any other subdomains of example.com or example.com itself. |
| 868 EXPECT_TRUE(CaptureOnly(extension.get(), example_com)); |
| 869 EXPECT_TRUE(CaptureOnly(extension.get(), sample_example_com)); |
| 870 EXPECT_TRUE(Allowed(extension.get(), test_example_com)); |
| 871 |
| 872 URLPatternSet blocked; |
| 873 blocked.AddPattern(test_example_com_pattern); |
| 874 URLPatternSet allowed; |
| 875 extension->permissions_data()->SetPolicyHostRestrictions(blocked, allowed); |
| 876 |
| 877 // We've applied an individual policy which overrides the default policy. |
| 878 // The only URL that should be blocked is test.example.com. |
| 879 EXPECT_TRUE(Allowed(extension.get(), example_com)); |
| 880 EXPECT_TRUE(Allowed(extension.get(), sample_example_com)); |
| 881 EXPECT_TRUE(CaptureOnly(extension.get(), test_example_com)); |
| 882 |
| 883 blocked.AddPattern(example_com_pattern); |
| 884 allowed.AddPattern(test_example_com_pattern); |
| 885 extension->permissions_data()->SetPolicyHostRestrictions(blocked, allowed); |
| 886 |
| 887 // Adding example.com and all its subdomains to the blocked list and |
| 888 // test.example.com to the whitelist. This is still the individual policy |
| 889 // Since the whitelist overrides a blacklist we expect to allow access to |
| 890 // test.example.com but block access to all other example.com subdomains |
| 891 // (sample.example.com) and example.com itself. |
| 892 EXPECT_TRUE(CaptureOnly(extension.get(), example_com)); |
| 893 EXPECT_TRUE(CaptureOnly(extension.get(), sample_example_com)); |
| 894 EXPECT_TRUE(Allowed(extension.get(), test_example_com)); |
| 895 |
| 896 blocked.ClearPatterns(); |
| 897 allowed.ClearPatterns(); |
| 898 extension->permissions_data()->SetPolicyHostRestrictions(blocked, allowed); |
| 899 |
| 900 // Cleared all URLs from the individual policy, so all URLs should have |
| 901 // access. We want to make sure that a block at the default level doesn't |
| 902 // apply since we're still definining an individual policy. |
| 903 EXPECT_TRUE(Allowed(extension.get(), example_com)); |
| 904 EXPECT_TRUE(Allowed(extension.get(), sample_example_com)); |
| 905 EXPECT_TRUE(Allowed(extension.get(), test_example_com)); |
| 906 |
| 907 // Flip back to using default policy for this extension. |
| 908 extension->permissions_data()->SetUsesDefaultHostRestrictions(); |
| 909 |
| 910 // Make sure the default policy has the same effect as before we defined an |
| 911 // individual policy. Access to test.example.com should be allowed, but all |
| 912 // other subdomains and example.com itself should be blocked. |
| 913 EXPECT_TRUE(CaptureOnly(extension.get(), example_com)); |
| 914 EXPECT_TRUE(CaptureOnly(extension.get(), sample_example_com)); |
| 915 EXPECT_TRUE(Allowed(extension.get(), test_example_com)); |
| 916 } |
| 917 |
| 918 TEST_F(ExtensionScriptAndCaptureVisibleTest, PolicyHostRestrictions) { |
| 919 // Test that host restrictions applied by policy take effect on normal URLs, |
| 920 // iframe urls, different schemes, and components. |
| 921 URLPatternSet default_blocked; |
| 922 URLPatternSet default_allowed; |
| 923 default_blocked.AddPattern( |
| 924 URLPattern(URLPattern::SCHEME_ALL, "https://*.example.com/*")); |
| 925 default_allowed.AddPattern( |
| 926 URLPattern(URLPattern::SCHEME_ALL, "https://test.example.com/*")); |
| 927 |
| 928 // In all of these tests, test.example.com should have scripting allowed, with |
| 929 // all other subdomains and example.com itself blocked. |
| 930 |
| 931 // Test <all_urls> for regular extensions. |
| 932 scoped_refptr<Extension> extension = |
| 933 LoadManifestStrict("script_and_capture", "extension_regular_all.json"); |
| 934 extension->permissions_data()->SetDefaultPolicyHostRestrictions( |
| 935 default_blocked, default_allowed); |
| 936 |
| 937 EXPECT_TRUE(Allowed(extension.get(), http_url)); |
| 938 EXPECT_TRUE(Allowed(extension.get(), https_url)); |
| 939 EXPECT_TRUE(CaptureOnly(extension.get(), example_com)); |
| 940 EXPECT_TRUE(Allowed(extension.get(), test_example_com)); |
| 941 EXPECT_TRUE(CaptureOnly(extension.get(), sample_example_com)); |
| 942 EXPECT_TRUE(CaptureOnly(extension.get(), file_url)); |
| 943 EXPECT_TRUE(CaptureOnly(extension.get(), settings_url)); |
| 944 EXPECT_TRUE(CaptureOnly(extension.get(), favicon_url)); |
| 945 EXPECT_TRUE(CaptureOnly(extension.get(), about_url)); |
| 946 EXPECT_TRUE(CaptureOnly(extension.get(), extension_url)); |
| 947 |
| 948 // Test access to iframed content. |
| 949 GURL within_extension_url = extension->GetResourceURL("page.html"); |
| 950 EXPECT_TRUE(AllowedScript(extension.get(), http_url)); |
| 951 EXPECT_TRUE(AllowedScript(extension.get(), http_url_with_path)); |
| 952 EXPECT_TRUE(BlockedScript(extension.get(), example_com)); |
| 953 EXPECT_TRUE(AllowedScript(extension.get(), test_example_com)); |
| 954 EXPECT_TRUE(BlockedScript(extension.get(), sample_example_com)); |
| 955 EXPECT_TRUE(AllowedScript(extension.get(), https_url)); |
| 956 EXPECT_TRUE(BlockedScript(extension.get(), within_extension_url)); |
| 957 EXPECT_TRUE(BlockedScript(extension.get(), extension_url)); |
| 958 |
| 959 // Supress host permission for example.com since its on the blocklist |
| 960 EXPECT_FALSE(extension->permissions_data()->HasHostPermission(example_com)); |
| 961 // Allow host permission for test.example.com since its on the whitelist and |
| 962 // blacklist. The whitelist overrides the blacklist. |
| 963 EXPECT_TRUE( |
| 964 extension->permissions_data()->HasHostPermission(test_example_com)); |
| 965 EXPECT_FALSE(extension->permissions_data()->HasHostPermission(settings_url)); |
| 966 EXPECT_FALSE(extension->permissions_data()->HasHostPermission(about_url)); |
| 967 EXPECT_TRUE(extension->permissions_data()->HasHostPermission(favicon_url)); |
| 968 |
| 969 // Test * for scheme, which implies just the http/https schemes. |
| 970 extension = |
| 971 LoadManifestStrict("script_and_capture", "extension_wildcard.json"); |
| 972 extension->permissions_data()->SetDefaultPolicyHostRestrictions( |
| 973 default_blocked, default_allowed); |
| 974 EXPECT_TRUE(ScriptOnly(extension.get(), http_url)); |
| 975 EXPECT_TRUE(Blocked(extension.get(), example_com)); |
| 976 EXPECT_TRUE(ScriptOnly(extension.get(), test_example_com)); |
| 977 EXPECT_TRUE(Blocked(extension.get(), sample_example_com)); |
| 978 EXPECT_TRUE(ScriptOnly(extension.get(), https_url)); |
| 979 EXPECT_TRUE(Blocked(extension.get(), settings_url)); |
| 980 EXPECT_TRUE(Blocked(extension.get(), about_url)); |
| 981 EXPECT_TRUE(Blocked(extension.get(), file_url)); |
| 982 EXPECT_TRUE(Blocked(extension.get(), favicon_url)); |
| 983 extension = |
| 984 LoadManifest("script_and_capture", "extension_wildcard_settings.json"); |
| 985 extension->permissions_data()->SetDefaultPolicyHostRestrictions( |
| 986 default_blocked, default_allowed); |
| 987 EXPECT_TRUE(Blocked(extension.get(), settings_url)); |
| 988 |
| 989 // Component extensions with <all_urls> should get everything regardless of |
| 990 // policy. |
| 991 extension = LoadManifest("script_and_capture", "extension_component_all.json", |
| 992 Manifest::COMPONENT, Extension::NO_FLAGS); |
| 993 extension->permissions_data()->SetDefaultPolicyHostRestrictions( |
| 994 default_blocked, default_allowed); |
| 995 EXPECT_TRUE(Allowed(extension.get(), http_url)); |
| 996 EXPECT_TRUE(Allowed(extension.get(), https_url)); |
| 997 EXPECT_TRUE(Allowed(extension.get(), example_com)); |
| 998 EXPECT_TRUE(Allowed(extension.get(), test_example_com)); |
| 999 EXPECT_TRUE(Allowed(extension.get(), sample_example_com)); |
| 1000 EXPECT_TRUE(Allowed(extension.get(), settings_url)); |
| 1001 EXPECT_TRUE(Allowed(extension.get(), about_url)); |
| 1002 EXPECT_TRUE(Allowed(extension.get(), favicon_url)); |
| 1003 EXPECT_TRUE(extension->permissions_data()->HasHostPermission(favicon_url)); |
| 1004 } |
| 1005 |
835 } // namespace extensions | 1006 } // namespace extensions |
OLD | NEW |