| 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" | |
| 19 #include "extensions/common/error_utils.h" | 18 #include "extensions/common/error_utils.h" |
| 20 #include "extensions/common/extension.h" | 19 #include "extensions/common/extension.h" |
| 21 #include "extensions/common/extension_builder.h" | 20 #include "extensions/common/extension_builder.h" |
| 22 #include "extensions/common/manifest.h" | 21 #include "extensions/common/manifest.h" |
| 23 #include "extensions/common/manifest_constants.h" | 22 #include "extensions/common/manifest_constants.h" |
| 24 #include "extensions/common/permissions/api_permission.h" | 23 #include "extensions/common/permissions/api_permission.h" |
| 25 #include "extensions/common/permissions/permission_message_test_util.h" | 24 #include "extensions/common/permissions/permission_message_test_util.h" |
| 26 #include "extensions/common/permissions/permission_set.h" | 25 #include "extensions/common/permissions/permission_set.h" |
| 27 #include "extensions/common/permissions/permissions_data.h" | 26 #include "extensions/common/permissions/permissions_data.h" |
| 28 #include "extensions/common/permissions/socket_permission.h" | 27 #include "extensions/common/permissions/socket_permission.h" |
| (...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 218 EXPECT_TRUE(hosts.MatchesURL(GURL("http://www.google.com"))); | 217 EXPECT_TRUE(hosts.MatchesURL(GURL("http://www.google.com"))); |
| 219 EXPECT_TRUE(extension->permissions_data()->HasEffectiveAccessToAllHosts()); | 218 EXPECT_TRUE(extension->permissions_data()->HasEffectiveAccessToAllHosts()); |
| 220 | 219 |
| 221 // Tab-specific permissions should be included in the effective hosts. | 220 // Tab-specific permissions should be included in the effective hosts. |
| 222 GURL tab_url("http://www.example.com/"); | 221 GURL tab_url("http://www.example.com/"); |
| 223 URLPatternSet new_hosts; | 222 URLPatternSet new_hosts; |
| 224 new_hosts.AddOrigin(URLPattern::SCHEME_ALL, tab_url); | 223 new_hosts.AddOrigin(URLPattern::SCHEME_ALL, tab_url); |
| 225 extension->permissions_data()->UpdateTabSpecificPermissions( | 224 extension->permissions_data()->UpdateTabSpecificPermissions( |
| 226 1, PermissionSet(APIPermissionSet(), ManifestPermissionSet(), new_hosts, | 225 1, PermissionSet(APIPermissionSet(), ManifestPermissionSet(), new_hosts, |
| 227 URLPatternSet())); | 226 URLPatternSet())); |
| 228 EXPECT_TRUE( | 227 EXPECT_TRUE(extension->permissions_data()->GetEffectiveHostPermissions(). |
| 229 extension->permissions_data()->GetEffectiveHostPermissions().MatchesURL( | 228 MatchesURL(tab_url)); |
| 230 tab_url)); | |
| 231 extension->permissions_data()->ClearTabSpecificPermissions(1); | 229 extension->permissions_data()->ClearTabSpecificPermissions(1); |
| 232 EXPECT_FALSE( | 230 EXPECT_FALSE(extension->permissions_data()->GetEffectiveHostPermissions(). |
| 233 extension->permissions_data()->GetEffectiveHostPermissions().MatchesURL( | 231 MatchesURL(tab_url)); |
| 234 tab_url)); | |
| 235 } | 232 } |
| 236 | 233 |
| 237 TEST(PermissionsDataTest, SocketPermissions) { | 234 TEST(PermissionsDataTest, SocketPermissions) { |
| 238 scoped_refptr<Extension> extension; | 235 scoped_refptr<Extension> extension; |
| 239 std::string error; | 236 std::string error; |
| 240 | 237 |
| 241 extension = LoadManifest("socket_permissions", "empty.json"); | 238 extension = LoadManifest("socket_permissions", "empty.json"); |
| 242 EXPECT_FALSE(CheckSocketPermission( | 239 EXPECT_FALSE(CheckSocketPermission(extension, |
| 243 extension, SocketPermissionRequest::TCP_CONNECT, "www.example.com", 80)); | 240 SocketPermissionRequest::TCP_CONNECT, "www.example.com", 80)); |
| 244 | 241 |
| 245 extension = LoadManifestUnchecked("socket_permissions", | 242 extension = LoadManifestUnchecked("socket_permissions", |
| 246 "socket1.json", | 243 "socket1.json", |
| 247 Manifest::INTERNAL, Extension::NO_FLAGS, | 244 Manifest::INTERNAL, Extension::NO_FLAGS, |
| 248 &error); | 245 &error); |
| 249 EXPECT_TRUE(extension.get() == NULL); | 246 EXPECT_TRUE(extension.get() == NULL); |
| 250 std::string expected_error_msg_header = ErrorUtils::FormatErrorMessage( | 247 std::string expected_error_msg_header = ErrorUtils::FormatErrorMessage( |
| 251 manifest_errors::kInvalidPermissionWithDetail, | 248 manifest_errors::kInvalidPermissionWithDetail, |
| 252 "socket", | 249 "socket", |
| 253 "NULL or empty permission list"); | 250 "NULL or empty permission list"); |
| 254 EXPECT_EQ(expected_error_msg_header, error); | 251 EXPECT_EQ(expected_error_msg_header, error); |
| 255 | 252 |
| 256 extension = LoadManifest("socket_permissions", "socket2.json"); | 253 extension = LoadManifest("socket_permissions", "socket2.json"); |
| 254 EXPECT_TRUE(CheckSocketPermission(extension, |
| 255 SocketPermissionRequest::TCP_CONNECT, "www.example.com", 80)); |
| 256 EXPECT_FALSE(CheckSocketPermission( |
| 257 extension, SocketPermissionRequest::UDP_BIND, "", 80)); |
| 257 EXPECT_TRUE(CheckSocketPermission( | 258 EXPECT_TRUE(CheckSocketPermission( |
| 258 extension, SocketPermissionRequest::TCP_CONNECT, "www.example.com", 80)); | 259 extension, SocketPermissionRequest::UDP_BIND, "", 8888)); |
| 259 EXPECT_FALSE(CheckSocketPermission( | |
| 260 extension, SocketPermissionRequest::UDP_BIND, "", 80)); | |
| 261 EXPECT_TRUE(CheckSocketPermission( | |
| 262 extension, SocketPermissionRequest::UDP_BIND, "", 8888)); | |
| 263 | 260 |
| 264 EXPECT_FALSE(CheckSocketPermission( | 261 EXPECT_FALSE(CheckSocketPermission( |
| 265 extension, SocketPermissionRequest::UDP_SEND_TO, "example.com", 1900)); | 262 extension, SocketPermissionRequest::UDP_SEND_TO, "example.com", 1900)); |
| 266 EXPECT_TRUE(CheckSocketPermission(extension, | 263 EXPECT_TRUE(CheckSocketPermission( |
| 267 SocketPermissionRequest::UDP_SEND_TO, | 264 extension, |
| 268 "239.255.255.250", 1900)); | 265 SocketPermissionRequest::UDP_SEND_TO, |
| 266 "239.255.255.250", 1900)); |
| 269 } | 267 } |
| 270 | 268 |
| 271 TEST(PermissionsDataTest, IsRestrictedUrl) { | 269 TEST(PermissionsDataTest, IsRestrictedUrl) { |
| 272 scoped_refptr<const Extension> extension = | 270 scoped_refptr<const Extension> extension = |
| 273 GetExtensionWithHostPermission("normal_extension", | 271 GetExtensionWithHostPermission("normal_extension", |
| 274 kAllHostsPermission, | 272 kAllHostsPermission, |
| 275 Manifest::INTERNAL); | 273 Manifest::INTERNAL); |
| 276 // Chrome urls should be blocked for normal extensions. | 274 // Chrome urls should be blocked for normal extensions. |
| 277 CheckRestrictedUrls(extension.get(), true); | 275 CheckRestrictedUrls(extension.get(), true); |
| 278 | 276 |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 376 } | 374 } |
| 377 | 375 |
| 378 // Base class for testing the CanAccessPage and CanCaptureVisiblePage | 376 // Base class for testing the CanAccessPage and CanCaptureVisiblePage |
| 379 // methods of Extension for extensions with various permissions. | 377 // methods of Extension for extensions with various permissions. |
| 380 class ExtensionScriptAndCaptureVisibleTest : public testing::Test { | 378 class ExtensionScriptAndCaptureVisibleTest : public testing::Test { |
| 381 protected: | 379 protected: |
| 382 ExtensionScriptAndCaptureVisibleTest() | 380 ExtensionScriptAndCaptureVisibleTest() |
| 383 : http_url("http://www.google.com"), | 381 : http_url("http://www.google.com"), |
| 384 http_url_with_path("http://www.google.com/index.html"), | 382 http_url_with_path("http://www.google.com/index.html"), |
| 385 https_url("https://www.google.com"), | 383 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"), | |
| 389 file_url("file:///foo/bar"), | 384 file_url("file:///foo/bar"), |
| 390 favicon_url("chrome://favicon/http://www.google.com"), | 385 favicon_url("chrome://favicon/http://www.google.com"), |
| 391 extension_url("chrome-extension://" + | 386 extension_url("chrome-extension://" + |
| 392 crx_file::id_util::GenerateIdForPath( | 387 crx_file::id_util::GenerateIdForPath( |
| 393 base::FilePath(FILE_PATH_LITERAL("foo")))), | 388 base::FilePath(FILE_PATH_LITERAL("foo")))), |
| 394 settings_url("chrome://settings"), | 389 settings_url("chrome://settings"), |
| 395 about_url("about:flags") { | 390 about_url("about:flags") { |
| 396 urls_.insert(http_url); | 391 urls_.insert(http_url); |
| 397 urls_.insert(http_url_with_path); | 392 urls_.insert(http_url_with_path); |
| 398 urls_.insert(https_url); | 393 urls_.insert(https_url); |
| 399 urls_.insert(example_com); | |
| 400 urls_.insert(test_example_com); | |
| 401 urls_.insert(sample_example_com); | |
| 402 urls_.insert(file_url); | 394 urls_.insert(file_url); |
| 403 urls_.insert(favicon_url); | 395 urls_.insert(favicon_url); |
| 404 urls_.insert(extension_url); | 396 urls_.insert(extension_url); |
| 405 urls_.insert(settings_url); | 397 urls_.insert(settings_url); |
| 406 urls_.insert(about_url); | 398 urls_.insert(about_url); |
| 407 // Ignore the policy delegate for this test. | 399 // Ignore the policy delegate for this test. |
| 408 PermissionsData::SetPolicyDelegate(NULL); | 400 PermissionsData::SetPolicyDelegate(NULL); |
| 409 } | 401 } |
| 410 | 402 |
| 411 bool AllowedScript(const Extension* extension, const GURL& url) { | 403 bool AllowedScript(const Extension* extension, const GURL& url) { |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 477 result &= Blocked(extension, url, tab_id); | 469 result &= Blocked(extension, url, tab_id); |
| 478 } | 470 } |
| 479 return result; | 471 return result; |
| 480 } | 472 } |
| 481 | 473 |
| 482 // URLs that are "safe" to provide scripting and capture visible tab access | 474 // URLs that are "safe" to provide scripting and capture visible tab access |
| 483 // to if the permissions allow it. | 475 // to if the permissions allow it. |
| 484 const GURL http_url; | 476 const GURL http_url; |
| 485 const GURL http_url_with_path; | 477 const GURL http_url_with_path; |
| 486 const GURL https_url; | 478 const GURL https_url; |
| 487 const GURL example_com; | |
| 488 const GURL test_example_com; | |
| 489 const GURL sample_example_com; | |
| 490 const GURL file_url; | 479 const GURL file_url; |
| 491 | 480 |
| 492 // We should allow host permission but not scripting permission for favicon | 481 // We should allow host permission but not scripting permission for favicon |
| 493 // urls. | 482 // urls. |
| 494 const GURL favicon_url; | 483 const GURL favicon_url; |
| 495 | 484 |
| 496 // URLs that regular extensions should never get access to. | 485 // URLs that regular extensions should never get access to. |
| 497 const GURL extension_url; | 486 const GURL extension_url; |
| 498 const GURL settings_url; | 487 const GURL settings_url; |
| 499 const GURL about_url; | 488 const GURL about_url; |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 596 EXPECT_FALSE(extension->permissions_data()->HasHostPermission(settings_url)); | 585 EXPECT_FALSE(extension->permissions_data()->HasHostPermission(settings_url)); |
| 597 } | 586 } |
| 598 | 587 |
| 599 TEST_F(ExtensionScriptAndCaptureVisibleTest, PermissionsWithChromeURLsEnabled) { | 588 TEST_F(ExtensionScriptAndCaptureVisibleTest, PermissionsWithChromeURLsEnabled) { |
| 600 base::CommandLine::ForCurrentProcess()->AppendSwitch( | 589 base::CommandLine::ForCurrentProcess()->AppendSwitch( |
| 601 switches::kExtensionsOnChromeURLs); | 590 switches::kExtensionsOnChromeURLs); |
| 602 | 591 |
| 603 scoped_refptr<Extension> extension; | 592 scoped_refptr<Extension> extension; |
| 604 | 593 |
| 605 // Test <all_urls> for regular extensions. | 594 // Test <all_urls> for regular extensions. |
| 606 extension = | 595 extension = LoadManifestStrict("script_and_capture", |
| 607 LoadManifestStrict("script_and_capture", "extension_regular_all.json"); | 596 "extension_regular_all.json"); |
| 608 EXPECT_TRUE(Allowed(extension.get(), http_url)); | 597 EXPECT_TRUE(Allowed(extension.get(), http_url)); |
| 609 EXPECT_TRUE(Allowed(extension.get(), https_url)); | 598 EXPECT_TRUE(Allowed(extension.get(), https_url)); |
| 610 EXPECT_TRUE(CaptureOnly(extension.get(), file_url)); | 599 EXPECT_TRUE(CaptureOnly(extension.get(), file_url)); |
| 611 EXPECT_TRUE(CaptureOnly(extension.get(), settings_url)); | 600 EXPECT_TRUE(CaptureOnly(extension.get(), settings_url)); |
| 612 EXPECT_TRUE(Allowed(extension.get(), favicon_url)); // chrome:// requested | 601 EXPECT_TRUE(Allowed(extension.get(), favicon_url)); // chrome:// requested |
| 613 EXPECT_TRUE(CaptureOnly(extension.get(), about_url)); | 602 EXPECT_TRUE(CaptureOnly(extension.get(), about_url)); |
| 614 EXPECT_TRUE(CaptureOnly(extension.get(), extension_url)); | 603 EXPECT_TRUE(CaptureOnly(extension.get(), extension_url)); |
| 615 | 604 |
| 616 // Test access to iframed content. | 605 // Test access to iframed content. |
| 617 GURL within_extension_url = extension->GetResourceURL("page.html"); | 606 GURL within_extension_url = extension->GetResourceURL("page.html"); |
| 618 EXPECT_TRUE(AllowedScript(extension.get(), http_url)); | 607 EXPECT_TRUE(AllowedScript(extension.get(), http_url)); |
| 619 EXPECT_TRUE(AllowedScript(extension.get(), http_url_with_path)); | 608 EXPECT_TRUE(AllowedScript(extension.get(), http_url_with_path)); |
| 620 EXPECT_TRUE(AllowedScript(extension.get(), https_url)); | 609 EXPECT_TRUE(AllowedScript(extension.get(), https_url)); |
| 621 EXPECT_TRUE(BlockedScript(extension.get(), within_extension_url)); | 610 EXPECT_TRUE(BlockedScript(extension.get(), within_extension_url)); |
| 622 EXPECT_TRUE(BlockedScript(extension.get(), extension_url)); | 611 EXPECT_TRUE(BlockedScript(extension.get(), extension_url)); |
| 623 | 612 |
| 624 const PermissionsData* permissions_data = extension->permissions_data(); | 613 const PermissionsData* permissions_data = extension->permissions_data(); |
| 625 EXPECT_FALSE(permissions_data->HasHostPermission(settings_url)); | 614 EXPECT_FALSE(permissions_data->HasHostPermission(settings_url)); |
| 626 EXPECT_FALSE(permissions_data->HasHostPermission(about_url)); | 615 EXPECT_FALSE(permissions_data->HasHostPermission(about_url)); |
| 627 EXPECT_TRUE(permissions_data->HasHostPermission(favicon_url)); | 616 EXPECT_TRUE(permissions_data->HasHostPermission(favicon_url)); |
| 628 | 617 |
| 629 // Test * for scheme, which implies just the http/https schemes. | 618 // Test * for scheme, which implies just the http/https schemes. |
| 630 extension = | 619 extension = LoadManifestStrict("script_and_capture", |
| 631 LoadManifestStrict("script_and_capture", "extension_wildcard.json"); | 620 "extension_wildcard.json"); |
| 632 EXPECT_TRUE(ScriptOnly(extension.get(), http_url)); | 621 EXPECT_TRUE(ScriptOnly(extension.get(), http_url)); |
| 633 EXPECT_TRUE(ScriptOnly(extension.get(), https_url)); | 622 EXPECT_TRUE(ScriptOnly(extension.get(), https_url)); |
| 634 EXPECT_TRUE(Blocked(extension.get(), settings_url)); | 623 EXPECT_TRUE(Blocked(extension.get(), settings_url)); |
| 635 EXPECT_TRUE(Blocked(extension.get(), about_url)); | 624 EXPECT_TRUE(Blocked(extension.get(), about_url)); |
| 636 EXPECT_TRUE(Blocked(extension.get(), file_url)); | 625 EXPECT_TRUE(Blocked(extension.get(), file_url)); |
| 637 EXPECT_TRUE(Blocked(extension.get(), favicon_url)); | 626 EXPECT_TRUE(Blocked(extension.get(), favicon_url)); |
| 638 extension = | 627 extension = |
| 639 LoadManifest("script_and_capture", "extension_wildcard_settings.json"); | 628 LoadManifest("script_and_capture", "extension_wildcard_settings.json"); |
| 640 EXPECT_TRUE(Blocked(extension.get(), settings_url)); | 629 EXPECT_TRUE(Blocked(extension.get(), settings_url)); |
| 641 | 630 |
| 642 // Having chrome://*/ should work for regular extensions with the flag | 631 // Having chrome://*/ should work for regular extensions with the flag |
| 643 // enabled. | 632 // enabled. |
| 644 std::string error; | 633 std::string error; |
| 645 extension = LoadManifestUnchecked("script_and_capture", | 634 extension = LoadManifestUnchecked("script_and_capture", |
| 646 "extension_wildcard_chrome.json", | 635 "extension_wildcard_chrome.json", |
| 647 Manifest::INTERNAL, Extension::NO_FLAGS, | 636 Manifest::INTERNAL, Extension::NO_FLAGS, |
| 648 &error); | 637 &error); |
| 649 EXPECT_FALSE(extension.get() == NULL); | 638 EXPECT_FALSE(extension.get() == NULL); |
| 650 EXPECT_TRUE(Blocked(extension.get(), http_url)); | 639 EXPECT_TRUE(Blocked(extension.get(), http_url)); |
| 651 EXPECT_TRUE(Blocked(extension.get(), https_url)); | 640 EXPECT_TRUE(Blocked(extension.get(), https_url)); |
| 652 EXPECT_TRUE(ScriptOnly(extension.get(), settings_url)); | 641 EXPECT_TRUE(ScriptOnly(extension.get(), settings_url)); |
| 653 EXPECT_TRUE(Blocked(extension.get(), about_url)); | 642 EXPECT_TRUE(Blocked(extension.get(), about_url)); |
| 654 EXPECT_TRUE(Blocked(extension.get(), file_url)); | 643 EXPECT_TRUE(Blocked(extension.get(), file_url)); |
| 655 EXPECT_TRUE(ScriptOnly(extension.get(), favicon_url)); | 644 EXPECT_TRUE(ScriptOnly(extension.get(), favicon_url)); |
| 656 | 645 |
| 657 // Having chrome://favicon/* should not give you chrome://* | 646 // Having chrome://favicon/* should not give you chrome://* |
| 658 extension = LoadManifestStrict("script_and_capture", | 647 extension = LoadManifestStrict("script_and_capture", |
| 659 "extension_chrome_favicon_wildcard.json"); | 648 "extension_chrome_favicon_wildcard.json"); |
| 660 EXPECT_TRUE(Blocked(extension.get(), settings_url)); | 649 EXPECT_TRUE(Blocked(extension.get(), settings_url)); |
| 661 EXPECT_TRUE(ScriptOnly(extension.get(), favicon_url)); | 650 EXPECT_TRUE(ScriptOnly(extension.get(), favicon_url)); |
| 662 EXPECT_TRUE(Blocked(extension.get(), about_url)); | 651 EXPECT_TRUE(Blocked(extension.get(), about_url)); |
| 663 EXPECT_TRUE(extension->permissions_data()->HasHostPermission(favicon_url)); | 652 EXPECT_TRUE(extension->permissions_data()->HasHostPermission(favicon_url)); |
| 664 | 653 |
| 665 // Having http://favicon should not give you chrome://favicon | 654 // Having http://favicon should not give you chrome://favicon |
| 666 extension = | 655 extension = LoadManifestStrict("script_and_capture", |
| 667 LoadManifestStrict("script_and_capture", "extension_http_favicon.json"); | 656 "extension_http_favicon.json"); |
| 668 EXPECT_TRUE(Blocked(extension.get(), settings_url)); | 657 EXPECT_TRUE(Blocked(extension.get(), settings_url)); |
| 669 EXPECT_TRUE(Blocked(extension.get(), favicon_url)); | 658 EXPECT_TRUE(Blocked(extension.get(), favicon_url)); |
| 670 | 659 |
| 671 // Component extensions with <all_urls> should get everything. | 660 // Component extensions with <all_urls> should get everything. |
| 672 extension = LoadManifest("script_and_capture", "extension_component_all.json", | 661 extension = LoadManifest("script_and_capture", "extension_component_all.json", |
| 673 Manifest::COMPONENT, Extension::NO_FLAGS); | 662 Manifest::COMPONENT, Extension::NO_FLAGS); |
| 674 EXPECT_TRUE(Allowed(extension.get(), http_url)); | 663 EXPECT_TRUE(Allowed(extension.get(), http_url)); |
| 675 EXPECT_TRUE(Allowed(extension.get(), https_url)); | 664 EXPECT_TRUE(Allowed(extension.get(), https_url)); |
| 676 EXPECT_TRUE(Allowed(extension.get(), settings_url)); | 665 EXPECT_TRUE(Allowed(extension.get(), settings_url)); |
| 677 EXPECT_TRUE(Allowed(extension.get(), about_url)); | 666 EXPECT_TRUE(Allowed(extension.get(), about_url)); |
| 678 EXPECT_TRUE(Allowed(extension.get(), favicon_url)); | 667 EXPECT_TRUE(Allowed(extension.get(), favicon_url)); |
| 679 EXPECT_TRUE(extension->permissions_data()->HasHostPermission(favicon_url)); | 668 EXPECT_TRUE(extension->permissions_data()->HasHostPermission(favicon_url)); |
| 680 | 669 |
| 681 // Component extensions should only get access to what they ask for. | 670 // Component extensions should only get access to what they ask for. |
| 682 extension = | 671 extension = LoadManifest("script_and_capture", |
| 683 LoadManifest("script_and_capture", "extension_component_google.json", | 672 "extension_component_google.json", Manifest::COMPONENT, |
| 684 Manifest::COMPONENT, Extension::NO_FLAGS); | 673 Extension::NO_FLAGS); |
| 685 EXPECT_TRUE(ScriptOnly(extension.get(), http_url)); | 674 EXPECT_TRUE(ScriptOnly(extension.get(), http_url)); |
| 686 EXPECT_TRUE(Blocked(extension.get(), https_url)); | 675 EXPECT_TRUE(Blocked(extension.get(), https_url)); |
| 687 EXPECT_TRUE(Blocked(extension.get(), file_url)); | 676 EXPECT_TRUE(Blocked(extension.get(), file_url)); |
| 688 EXPECT_TRUE(Blocked(extension.get(), settings_url)); | 677 EXPECT_TRUE(Blocked(extension.get(), settings_url)); |
| 689 EXPECT_TRUE(Blocked(extension.get(), favicon_url)); | 678 EXPECT_TRUE(Blocked(extension.get(), favicon_url)); |
| 690 EXPECT_TRUE(Blocked(extension.get(), about_url)); | 679 EXPECT_TRUE(Blocked(extension.get(), about_url)); |
| 691 EXPECT_TRUE(Blocked(extension.get(), extension_url)); | 680 EXPECT_TRUE(Blocked(extension.get(), extension_url)); |
| 692 EXPECT_FALSE(extension->permissions_data()->HasHostPermission(settings_url)); | 681 EXPECT_FALSE(extension->permissions_data()->HasHostPermission(settings_url)); |
| 693 } | 682 } |
| 694 | 683 |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 836 kTabId, &error)) | 825 kTabId, &error)) |
| 837 << extension->name() << ": " << url; | 826 << extension->name() << ": " << url; |
| 838 EXPECT_EQ(PermissionsData::ACCESS_DENIED, | 827 EXPECT_EQ(PermissionsData::ACCESS_DENIED, |
| 839 extension->permissions_data()->GetContentScriptAccess( | 828 extension->permissions_data()->GetContentScriptAccess( |
| 840 extension, url, kTabId, &error)) | 829 extension, url, kTabId, &error)) |
| 841 << extension->name() << ": " << url; | 830 << extension->name() << ": " << url; |
| 842 } | 831 } |
| 843 } | 832 } |
| 844 } | 833 } |
| 845 | 834 |
| 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 | |
| 1006 } // namespace extensions | 835 } // namespace extensions |
| OLD | NEW |