| 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 |