| 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 <vector> | 5 #include <vector> |
| 6 | 6 |
| 7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
| 8 #include "base/memory/ref_counted.h" | 8 #include "base/memory/ref_counted.h" |
| 9 #include "base/strings/string16.h" | 9 #include "base/strings/string16.h" |
| 10 #include "base/strings/utf_string_conversions.h" | 10 #include "base/strings/utf_string_conversions.h" |
| 11 #include "chrome/common/chrome_version_info.h" | 11 #include "chrome/common/chrome_version_info.h" |
| 12 #include "chrome/common/extensions/extension_test_util.h" | 12 #include "chrome/common/extensions/extension_test_util.h" |
| 13 #include "chrome/common/extensions/features/feature_channel.h" | 13 #include "chrome/common/extensions/features/feature_channel.h" |
| 14 #include "content/public/common/socket_permission_request.h" | 14 #include "content/public/common/socket_permission_request.h" |
| 15 #include "extensions/common/error_utils.h" | 15 #include "extensions/common/error_utils.h" |
| 16 #include "extensions/common/extension.h" | 16 #include "extensions/common/extension.h" |
| 17 #include "extensions/common/extension_builder.h" |
| 17 #include "extensions/common/id_util.h" | 18 #include "extensions/common/id_util.h" |
| 19 #include "extensions/common/manifest.h" |
| 18 #include "extensions/common/manifest_constants.h" | 20 #include "extensions/common/manifest_constants.h" |
| 19 #include "extensions/common/permissions/api_permission.h" | 21 #include "extensions/common/permissions/api_permission.h" |
| 20 #include "extensions/common/permissions/permission_set.h" | 22 #include "extensions/common/permissions/permission_set.h" |
| 21 #include "extensions/common/permissions/permissions_data.h" | 23 #include "extensions/common/permissions/permissions_data.h" |
| 22 #include "extensions/common/permissions/socket_permission.h" | 24 #include "extensions/common/permissions/socket_permission.h" |
| 23 #include "extensions/common/switches.h" | 25 #include "extensions/common/switches.h" |
| 24 #include "extensions/common/url_pattern_set.h" | 26 #include "extensions/common/url_pattern_set.h" |
| 27 #include "extensions/common/value_builder.h" |
| 25 #include "testing/gtest/include/gtest/gtest.h" | 28 #include "testing/gtest/include/gtest/gtest.h" |
| 29 #include "url/gurl.h" |
| 26 | 30 |
| 27 using base::UTF16ToUTF8; | 31 using base::UTF16ToUTF8; |
| 28 using content::SocketPermissionRequest; | 32 using content::SocketPermissionRequest; |
| 29 using extension_test_util::LoadManifest; | 33 using extension_test_util::LoadManifest; |
| 30 using extension_test_util::LoadManifestUnchecked; | 34 using extension_test_util::LoadManifestUnchecked; |
| 31 using extension_test_util::LoadManifestStrict; | 35 using extension_test_util::LoadManifestStrict; |
| 32 | 36 |
| 33 namespace extensions { | 37 namespace extensions { |
| 34 | 38 |
| 35 namespace { | 39 namespace { |
| 36 | 40 |
| 41 const char kAllHostsPermission[] = "*://*/*"; |
| 42 |
| 37 bool CheckSocketPermission( | 43 bool CheckSocketPermission( |
| 38 scoped_refptr<Extension> extension, | 44 scoped_refptr<Extension> extension, |
| 39 SocketPermissionRequest::OperationType type, | 45 SocketPermissionRequest::OperationType type, |
| 40 const char* host, | 46 const char* host, |
| 41 int port) { | 47 int port) { |
| 42 SocketPermission::CheckParam param(type, host, port); | 48 SocketPermission::CheckParam param(type, host, port); |
| 43 return PermissionsData::CheckAPIPermissionWithParam( | 49 return PermissionsData::CheckAPIPermissionWithParam( |
| 44 extension.get(), APIPermission::kSocket, ¶m); | 50 extension.get(), APIPermission::kSocket, ¶m); |
| 45 } | 51 } |
| 46 | 52 |
| 53 // Creates and returns an extension with the given |id|, |host_permissions|, and |
| 54 // manifest |location|. |
| 55 scoped_refptr<const Extension> GetExtensionWithHostPermission( |
| 56 const std::string& id, |
| 57 const std::string& host_permissions, |
| 58 Manifest::Location location) { |
| 59 ListBuilder permissions; |
| 60 if (!host_permissions.empty()) |
| 61 permissions.Append(host_permissions); |
| 62 |
| 63 return ExtensionBuilder() |
| 64 .SetManifest( |
| 65 DictionaryBuilder() |
| 66 .Set("name", id) |
| 67 .Set("description", "an extension") |
| 68 .Set("manifest_version", 2) |
| 69 .Set("version", "1.0.0") |
| 70 .Set("permissions", permissions.Pass()) |
| 71 .Build()) |
| 72 .SetLocation(location) |
| 73 .SetID(id) |
| 74 .Build(); |
| 75 } |
| 76 |
| 77 bool RequiresActionForScriptExecution(const std::string& extension_id, |
| 78 const std::string& host_permissions, |
| 79 Manifest::Location location) { |
| 80 scoped_refptr<const Extension> extension = |
| 81 GetExtensionWithHostPermission(extension_id, |
| 82 host_permissions, |
| 83 location); |
| 84 return PermissionsData::RequiresActionForScriptExecution( |
| 85 extension, |
| 86 -1, // Ignore tab id for these. |
| 87 GURL::EmptyGURL()); |
| 88 } |
| 89 |
| 47 } // namespace | 90 } // namespace |
| 48 | 91 |
| 49 TEST(ExtensionPermissionsTest, EffectiveHostPermissions) { | 92 TEST(ExtensionPermissionsTest, EffectiveHostPermissions) { |
| 50 scoped_refptr<Extension> extension; | 93 scoped_refptr<Extension> extension; |
| 51 URLPatternSet hosts; | 94 URLPatternSet hosts; |
| 52 | 95 |
| 53 extension = LoadManifest("effective_host_permissions", "empty.json"); | 96 extension = LoadManifest("effective_host_permissions", "empty.json"); |
| 54 EXPECT_EQ(0u, | 97 EXPECT_EQ(0u, |
| 55 PermissionsData::GetEffectiveHostPermissions(extension.get()) | 98 PermissionsData::GetEffectiveHostPermissions(extension.get()) |
| 56 .patterns().size()); | 99 .patterns().size()); |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 146 extension, SocketPermissionRequest::UDP_BIND, "", 8888)); | 189 extension, SocketPermissionRequest::UDP_BIND, "", 8888)); |
| 147 | 190 |
| 148 EXPECT_FALSE(CheckSocketPermission( | 191 EXPECT_FALSE(CheckSocketPermission( |
| 149 extension, SocketPermissionRequest::UDP_SEND_TO, "example.com", 1900)); | 192 extension, SocketPermissionRequest::UDP_SEND_TO, "example.com", 1900)); |
| 150 EXPECT_TRUE(CheckSocketPermission( | 193 EXPECT_TRUE(CheckSocketPermission( |
| 151 extension, | 194 extension, |
| 152 SocketPermissionRequest::UDP_SEND_TO, | 195 SocketPermissionRequest::UDP_SEND_TO, |
| 153 "239.255.255.250", 1900)); | 196 "239.255.255.250", 1900)); |
| 154 } | 197 } |
| 155 | 198 |
| 199 TEST(ExtensionPermissionsTest, RequiresActionForScriptExecution) { |
| 200 // Extensions with all_hosts should require action. |
| 201 EXPECT_TRUE(RequiresActionForScriptExecution( |
| 202 "all_hosts_permissions", kAllHostsPermission, Manifest::INTERNAL)); |
| 203 // Extensions with nearly all hosts are treated the same way. |
| 204 EXPECT_TRUE(RequiresActionForScriptExecution( |
| 205 "pseudo_all_hosts_permissions", "*://*.com/*", Manifest::INTERNAL)); |
| 206 // Extensions with explicit permissions shouldn't require action. |
| 207 EXPECT_FALSE(RequiresActionForScriptExecution( |
| 208 "explicit_permissions", "https://www.google.com/*", Manifest::INTERNAL)); |
| 209 // Policy extensions are exempt... |
| 210 EXPECT_FALSE(RequiresActionForScriptExecution( |
| 211 "policy", kAllHostsPermission, Manifest::EXTERNAL_POLICY)); |
| 212 // ... as are component extensions. |
| 213 EXPECT_FALSE(RequiresActionForScriptExecution( |
| 214 "component", kAllHostsPermission, Manifest::COMPONENT)); |
| 215 // Throw in an external pref extension to make sure that it's not just working |
| 216 // for everything non-internal. |
| 217 EXPECT_TRUE(RequiresActionForScriptExecution( |
| 218 "external_pref", kAllHostsPermission, Manifest::EXTERNAL_PREF)); |
| 219 |
| 220 // If we grant an extension tab permissions, then it should no longer require |
| 221 // action. |
| 222 scoped_refptr<const Extension> extension = |
| 223 GetExtensionWithHostPermission("all_hosts_permissions", |
| 224 kAllHostsPermission, |
| 225 Manifest::INTERNAL); |
| 226 URLPatternSet allowed_hosts; |
| 227 allowed_hosts.AddPattern( |
| 228 URLPattern(URLPattern::SCHEME_HTTPS, "https://www.google.com/*")); |
| 229 scoped_refptr<PermissionSet> tab_permissions( |
| 230 new PermissionSet(APIPermissionSet(), |
| 231 ManifestPermissionSet(), |
| 232 allowed_hosts, |
| 233 URLPatternSet())); |
| 234 PermissionsData::UpdateTabSpecificPermissions(extension, 0, tab_permissions); |
| 235 EXPECT_FALSE(PermissionsData::RequiresActionForScriptExecution( |
| 236 extension, 0, GURL("https://www.google.com/"))); |
| 237 } |
| 238 |
| 156 TEST(ExtensionPermissionsTest, GetPermissionMessages_ManyAPIPermissions) { | 239 TEST(ExtensionPermissionsTest, GetPermissionMessages_ManyAPIPermissions) { |
| 157 scoped_refptr<Extension> extension; | 240 scoped_refptr<Extension> extension; |
| 158 extension = LoadManifest("permissions", "many-apis.json"); | 241 extension = LoadManifest("permissions", "many-apis.json"); |
| 159 std::vector<base::string16> warnings = | 242 std::vector<base::string16> warnings = |
| 160 PermissionsData::GetPermissionMessageStrings(extension.get()); | 243 PermissionsData::GetPermissionMessageStrings(extension.get()); |
| 161 // Warning for "tabs" is suppressed by "history" permission. | 244 // Warning for "tabs" is suppressed by "history" permission. |
| 162 ASSERT_EQ(5u, warnings.size()); | 245 ASSERT_EQ(5u, warnings.size()); |
| 163 EXPECT_EQ("Access your data on api.flickr.com", | 246 EXPECT_EQ("Access your data on api.flickr.com", |
| 164 UTF16ToUTF8(warnings[0])); | 247 UTF16ToUTF8(warnings[0])); |
| 165 EXPECT_EQ("Read and modify your bookmarks", UTF16ToUTF8(warnings[1])); | 248 EXPECT_EQ("Read and modify your bookmarks", UTF16ToUTF8(warnings[1])); |
| (...skipping 466 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 632 PermissionsData::ClearTabSpecificPermissions(extension.get(), 1); | 715 PermissionsData::ClearTabSpecificPermissions(extension.get(), 1); |
| 633 EXPECT_FALSE(PermissionsData::GetTabSpecificPermissions(extension.get(), 1) | 716 EXPECT_FALSE(PermissionsData::GetTabSpecificPermissions(extension.get(), 1) |
| 634 .get()); | 717 .get()); |
| 635 | 718 |
| 636 EXPECT_TRUE(ScriptAllowedExclusivelyOnTab(extension.get(), no_urls, 0)); | 719 EXPECT_TRUE(ScriptAllowedExclusivelyOnTab(extension.get(), no_urls, 0)); |
| 637 EXPECT_TRUE(ScriptAllowedExclusivelyOnTab(extension.get(), no_urls, 1)); | 720 EXPECT_TRUE(ScriptAllowedExclusivelyOnTab(extension.get(), no_urls, 1)); |
| 638 EXPECT_TRUE(ScriptAllowedExclusivelyOnTab(extension.get(), no_urls, 2)); | 721 EXPECT_TRUE(ScriptAllowedExclusivelyOnTab(extension.get(), no_urls, 2)); |
| 639 } | 722 } |
| 640 | 723 |
| 641 } // namespace extensions | 724 } // namespace extensions |
| OLD | NEW |