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 |