| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "base/files/file_path.h" | 5 #include "base/files/file_path.h" |
| 6 #include "base/json/json_file_value_serializer.h" | 6 #include "base/json/json_file_value_serializer.h" |
| 7 #include "base/memory/ref_counted.h" | 7 #include "base/memory/ref_counted.h" |
| 8 #include "base/run_loop.h" | 8 #include "base/run_loop.h" |
| 9 #include "base/strings/stringprintf.h" | 9 #include "base/strings/stringprintf.h" |
| 10 #include "base/values.h" | 10 #include "base/values.h" |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 149 | 149 |
| 150 private: | 150 private: |
| 151 void Observe(int type, | 151 void Observe(int type, |
| 152 const content::NotificationSource& source, | 152 const content::NotificationSource& source, |
| 153 const content::NotificationDetails& details) override { | 153 const content::NotificationDetails& details) override { |
| 154 received_notification_ = true; | 154 received_notification_ = true; |
| 155 UpdatedExtensionPermissionsInfo* info = | 155 UpdatedExtensionPermissionsInfo* info = |
| 156 content::Details<UpdatedExtensionPermissionsInfo>(details).ptr(); | 156 content::Details<UpdatedExtensionPermissionsInfo>(details).ptr(); |
| 157 | 157 |
| 158 extension_ = info->extension; | 158 extension_ = info->extension; |
| 159 permissions_ = info->permissions; | 159 permissions_ = info->permissions.Clone(); |
| 160 reason_ = info->reason; | 160 reason_ = info->reason; |
| 161 | 161 |
| 162 if (waiting_) { | 162 if (waiting_) { |
| 163 waiting_ = false; | 163 waiting_ = false; |
| 164 base::MessageLoopForUI::current()->Quit(); | 164 base::MessageLoopForUI::current()->Quit(); |
| 165 } | 165 } |
| 166 } | 166 } |
| 167 | 167 |
| 168 bool received_notification_; | 168 bool received_notification_; |
| 169 bool waiting_; | 169 bool waiting_; |
| 170 content::NotificationRegistrar registrar_; | 170 content::NotificationRegistrar registrar_; |
| 171 scoped_refptr<const Extension> extension_; | 171 scoped_refptr<const Extension> extension_; |
| 172 scoped_refptr<const PermissionSet> permissions_; | 172 scoped_ptr<const PermissionSet> permissions_; |
| 173 UpdatedExtensionPermissionsInfo::Reason reason_; | 173 UpdatedExtensionPermissionsInfo::Reason reason_; |
| 174 }; | 174 }; |
| 175 | 175 |
| 176 class PermissionsUpdaterTest : public ExtensionServiceTestBase { | 176 class PermissionsUpdaterTest : public ExtensionServiceTestBase { |
| 177 }; | 177 }; |
| 178 | 178 |
| 179 scoped_refptr<Extension> LoadOurManifest() { | 179 scoped_refptr<Extension> LoadOurManifest() { |
| 180 base::FilePath path; | 180 base::FilePath path; |
| 181 path = path.AppendASCII("api_test") | 181 path = path.AppendASCII("api_test") |
| 182 .AppendASCII("permissions") | 182 .AppendASCII("permissions") |
| (...skipping 20 matching lines...) Expand all Loading... |
| 203 // Load the test extension. | 203 // Load the test extension. |
| 204 scoped_refptr<Extension> extension = LoadOurManifest(); | 204 scoped_refptr<Extension> extension = LoadOurManifest(); |
| 205 ASSERT_TRUE(extension.get()); | 205 ASSERT_TRUE(extension.get()); |
| 206 | 206 |
| 207 APIPermissionSet default_apis; | 207 APIPermissionSet default_apis; |
| 208 default_apis.insert(APIPermission::kManagement); | 208 default_apis.insert(APIPermission::kManagement); |
| 209 ManifestPermissionSet empty_manifest_permissions; | 209 ManifestPermissionSet empty_manifest_permissions; |
| 210 | 210 |
| 211 URLPatternSet default_hosts; | 211 URLPatternSet default_hosts; |
| 212 AddPattern(&default_hosts, "http://a.com/*"); | 212 AddPattern(&default_hosts, "http://a.com/*"); |
| 213 scoped_refptr<const PermissionSet> default_permissions = new PermissionSet( | 213 PermissionSet default_permissions(default_apis, empty_manifest_permissions, |
| 214 default_apis, empty_manifest_permissions, default_hosts, URLPatternSet()); | 214 default_hosts, URLPatternSet()); |
| 215 | 215 |
| 216 // Make sure it loaded properly. | 216 // Make sure it loaded properly. |
| 217 scoped_refptr<const PermissionSet> permissions = | 217 ASSERT_EQ(default_permissions, |
| 218 extension->permissions_data()->active_permissions(); | 218 *extension->permissions_data()->active_permissions()); |
| 219 ASSERT_EQ(*default_permissions.get(), | 219 |
| 220 *extension->permissions_data()->active_permissions().get()); | 220 ExtensionPrefs* prefs = ExtensionPrefs::Get(profile_.get()); |
| 221 scoped_ptr<const PermissionSet> active_permissions; |
| 222 scoped_ptr<const PermissionSet> granted_permissions; |
| 221 | 223 |
| 222 // Add a few permissions. | 224 // Add a few permissions. |
| 223 APIPermissionSet apis; | 225 APIPermissionSet apis; |
| 224 apis.insert(APIPermission::kNotifications); | 226 apis.insert(APIPermission::kNotifications); |
| 225 URLPatternSet hosts; | 227 URLPatternSet hosts; |
| 226 AddPattern(&hosts, "http://*.c.com/*"); | 228 AddPattern(&hosts, "http://*.c.com/*"); |
| 227 | 229 |
| 228 scoped_refptr<const PermissionSet> delta = new PermissionSet( | 230 { |
| 229 apis, empty_manifest_permissions, hosts, URLPatternSet()); | 231 PermissionSet delta(apis, empty_manifest_permissions, hosts, |
| 232 URLPatternSet()); |
| 230 | 233 |
| 231 PermissionsUpdaterListener listener; | 234 PermissionsUpdaterListener listener; |
| 232 PermissionsUpdater updater(profile_.get()); | 235 PermissionsUpdater(profile_.get()).AddPermissions(extension.get(), &delta); |
| 233 updater.AddPermissions(extension.get(), delta.get()); | |
| 234 | 236 |
| 235 listener.Wait(); | 237 listener.Wait(); |
| 236 | 238 |
| 237 // Verify that the permission notification was sent correctly. | 239 // Verify that the permission notification was sent correctly. |
| 238 ASSERT_TRUE(listener.received_notification()); | 240 ASSERT_TRUE(listener.received_notification()); |
| 239 ASSERT_EQ(extension.get(), listener.extension()); | 241 ASSERT_EQ(extension.get(), listener.extension()); |
| 240 ASSERT_EQ(UpdatedExtensionPermissionsInfo::ADDED, listener.reason()); | 242 ASSERT_EQ(UpdatedExtensionPermissionsInfo::ADDED, listener.reason()); |
| 241 ASSERT_EQ(*delta.get(), *listener.permissions()); | 243 ASSERT_EQ(delta, *listener.permissions()); |
| 242 | 244 |
| 243 // Make sure the extension's active permissions reflect the change. | 245 // Make sure the extension's active permissions reflect the change. |
| 244 scoped_refptr<const PermissionSet> active_permissions = | 246 active_permissions = PermissionSet::CreateUnion(default_permissions, delta); |
| 245 PermissionSet::CreateUnion(*default_permissions, *delta); | |
| 246 ASSERT_EQ(*active_permissions.get(), | 247 ASSERT_EQ(*active_permissions.get(), |
| 247 *extension->permissions_data()->active_permissions().get()); | 248 *extension->permissions_data()->active_permissions()); |
| 248 | 249 |
| 249 // Verify that the new granted and active permissions were also stored | 250 // Verify that the new granted and active permissions were also stored |
| 250 // in the extension preferences. In this case, the granted permissions should | 251 // in the extension preferences. In this case, the granted permissions should |
| 251 // be equal to the active permissions. | 252 // be equal to the active permissions. |
| 252 ExtensionPrefs* prefs = ExtensionPrefs::Get(profile_.get()); | 253 ASSERT_EQ(*active_permissions.get(), |
| 253 scoped_refptr<const PermissionSet> granted_permissions = active_permissions; | 254 *prefs->GetActivePermissions(extension->id())); |
| 255 granted_permissions = active_permissions->Clone(); |
| 256 ASSERT_EQ(*granted_permissions, |
| 257 *prefs->GetGrantedPermissions(extension->id())); |
| 258 } |
| 254 | 259 |
| 255 scoped_refptr<const PermissionSet> from_prefs = | 260 { |
| 256 prefs->GetActivePermissions(extension->id()); | |
| 257 ASSERT_EQ(*active_permissions.get(), *from_prefs.get()); | |
| 258 | |
| 259 from_prefs = prefs->GetGrantedPermissions(extension->id()); | |
| 260 ASSERT_EQ(*active_permissions.get(), *from_prefs.get()); | |
| 261 | |
| 262 // In the second part of the test, we'll remove the permissions that we | 261 // In the second part of the test, we'll remove the permissions that we |
| 263 // just added except for 'notifications'. | 262 // just added except for 'notifications'. |
| 264 apis.erase(APIPermission::kNotifications); | 263 apis.erase(APIPermission::kNotifications); |
| 265 delta = new PermissionSet(apis, empty_manifest_permissions, | 264 PermissionSet delta(apis, empty_manifest_permissions, hosts, URLPatternSet()); |
| 266 hosts, URLPatternSet()); | |
| 267 | 265 |
| 268 listener.Reset(); | 266 PermissionsUpdaterListener listener; |
| 269 updater.RemovePermissions(extension.get(), delta.get(), | 267 PermissionsUpdater(profile_.get()) |
| 270 PermissionsUpdater::REMOVE_SOFT); | 268 .RemovePermissions(extension.get(), &delta, |
| 269 PermissionsUpdater::REMOVE_SOFT); |
| 271 listener.Wait(); | 270 listener.Wait(); |
| 272 | 271 |
| 273 // Verify that the notification was correct. | 272 // Verify that the notification was correct. |
| 274 ASSERT_TRUE(listener.received_notification()); | 273 ASSERT_TRUE(listener.received_notification()); |
| 275 ASSERT_EQ(extension.get(), listener.extension()); | 274 ASSERT_EQ(extension.get(), listener.extension()); |
| 276 ASSERT_EQ(UpdatedExtensionPermissionsInfo::REMOVED, listener.reason()); | 275 ASSERT_EQ(UpdatedExtensionPermissionsInfo::REMOVED, listener.reason()); |
| 277 ASSERT_EQ(*delta.get(), *listener.permissions()); | 276 ASSERT_EQ(delta, *listener.permissions()); |
| 278 | 277 |
| 279 // Make sure the extension's active permissions reflect the change. | 278 // Make sure the extension's active permissions reflect the change. |
| 280 active_permissions = | 279 active_permissions = |
| 281 PermissionSet::CreateDifference(*active_permissions, *delta); | 280 PermissionSet::CreateDifference(*active_permissions, delta); |
| 282 ASSERT_EQ(*active_permissions.get(), | 281 ASSERT_EQ(*active_permissions.get(), |
| 283 *extension->permissions_data()->active_permissions().get()); | 282 *extension->permissions_data()->active_permissions()); |
| 284 | 283 |
| 285 // Verify that the extension prefs hold the new active permissions and the | 284 // Verify that the extension prefs hold the new active permissions and the |
| 286 // same granted permissions. | 285 // same granted permissions. |
| 287 from_prefs = prefs->GetActivePermissions(extension->id()); | 286 ASSERT_EQ(*active_permissions, *prefs->GetActivePermissions(extension->id())); |
| 288 ASSERT_EQ(*active_permissions.get(), *from_prefs.get()); | |
| 289 | 287 |
| 290 from_prefs = prefs->GetGrantedPermissions(extension->id()); | 288 ASSERT_EQ(*granted_permissions, |
| 291 ASSERT_EQ(*granted_permissions.get(), *from_prefs.get()); | 289 *prefs->GetGrantedPermissions(extension->id())); |
| 290 } |
| 292 } | 291 } |
| 293 | 292 |
| 294 TEST_F(PermissionsUpdaterTest, WithholdAllHosts) { | 293 TEST_F(PermissionsUpdaterTest, WithholdAllHosts) { |
| 295 InitializeEmptyExtensionService(); | 294 InitializeEmptyExtensionService(); |
| 296 | 295 |
| 297 // Permissions are only withheld with the appropriate switch turned on. | 296 // Permissions are only withheld with the appropriate switch turned on. |
| 298 scoped_ptr<FeatureSwitch::ScopedOverride> switch_override( | 297 scoped_ptr<FeatureSwitch::ScopedOverride> switch_override( |
| 299 new FeatureSwitch::ScopedOverride(FeatureSwitch::scripts_require_action(), | 298 new FeatureSwitch::ScopedOverride(FeatureSwitch::scripts_require_action(), |
| 300 FeatureSwitch::OVERRIDE_ENABLED)); | 299 FeatureSwitch::OVERRIDE_ENABLED)); |
| 301 | 300 |
| (...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 488 } | 487 } |
| 489 | 488 |
| 490 TEST_F(PermissionsUpdaterTest, RevokingPermissions) { | 489 TEST_F(PermissionsUpdaterTest, RevokingPermissions) { |
| 491 InitializeEmptyExtensionService(); | 490 InitializeEmptyExtensionService(); |
| 492 | 491 |
| 493 ExtensionPrefs* prefs = ExtensionPrefs::Get(profile()); | 492 ExtensionPrefs* prefs = ExtensionPrefs::Get(profile()); |
| 494 | 493 |
| 495 auto api_permission_set = [](APIPermission::ID id) { | 494 auto api_permission_set = [](APIPermission::ID id) { |
| 496 APIPermissionSet apis; | 495 APIPermissionSet apis; |
| 497 apis.insert(id); | 496 apis.insert(id); |
| 498 return make_scoped_refptr(new PermissionSet( | 497 return make_scoped_ptr(new PermissionSet(apis, ManifestPermissionSet(), |
| 499 apis, ManifestPermissionSet(), URLPatternSet(), URLPatternSet())); | 498 URLPatternSet(), URLPatternSet())); |
| 500 }; | 499 }; |
| 501 | 500 |
| 502 auto url_permission_set = [](const GURL& url) { | 501 auto url_permission_set = [](const GURL& url) { |
| 503 URLPatternSet set; | 502 URLPatternSet set; |
| 504 URLPattern pattern(URLPattern::SCHEME_ALL, url.spec()); | 503 URLPattern pattern(URLPattern::SCHEME_ALL, url.spec()); |
| 505 set.AddPattern(pattern); | 504 set.AddPattern(pattern); |
| 506 return make_scoped_refptr(new PermissionSet( | 505 return make_scoped_ptr(new PermissionSet( |
| 507 APIPermissionSet(), ManifestPermissionSet(), set, URLPatternSet())); | 506 APIPermissionSet(), ManifestPermissionSet(), set, URLPatternSet())); |
| 508 }; | 507 }; |
| 509 | 508 |
| 510 { | 509 { |
| 511 // Test revoking optional permissions. | 510 // Test revoking optional permissions. |
| 512 ListBuilder optional_permissions; | 511 ListBuilder optional_permissions; |
| 513 optional_permissions.Append("tabs").Append("cookies").Append("management"); | 512 optional_permissions.Append("tabs").Append("cookies").Append("management"); |
| 514 ListBuilder required_permissions; | 513 ListBuilder required_permissions; |
| 515 required_permissions.Append("topSites"); | 514 required_permissions.Append("topSites"); |
| 516 scoped_refptr<const Extension> extension = | 515 scoped_refptr<const Extension> extension = |
| 517 CreateExtensionWithOptionalPermissions(optional_permissions.Build(), | 516 CreateExtensionWithOptionalPermissions(optional_permissions.Build(), |
| 518 required_permissions.Build(), | 517 required_permissions.Build(), |
| 519 "My Extension"); | 518 "My Extension"); |
| 520 | 519 |
| 521 PermissionsUpdater updater(profile()); | 520 PermissionsUpdater updater(profile()); |
| 522 EXPECT_TRUE(updater.GetRevokablePermissions(extension.get())->IsEmpty()); | 521 EXPECT_TRUE(updater.GetRevokablePermissions(extension.get())->IsEmpty()); |
| 523 | 522 |
| 524 // Add the optional "cookies" permission. | 523 // Add the optional "cookies" permission. |
| 525 updater.AddPermissions(extension.get(), | 524 updater.AddPermissions(extension.get(), |
| 526 api_permission_set(APIPermission::kCookie).get()); | 525 api_permission_set(APIPermission::kCookie).get()); |
| 527 const PermissionsData* permissions = extension->permissions_data(); | 526 const PermissionsData* permissions = extension->permissions_data(); |
| 528 // The extension should have the permission in its active permissions and | 527 // The extension should have the permission in its active permissions and |
| 529 // its granted permissions (stored in prefs). And, the permission should | 528 // its granted permissions (stored in prefs). And, the permission should |
| 530 // be revokable. | 529 // be revokable. |
| 531 EXPECT_TRUE(permissions->HasAPIPermission(APIPermission::kCookie)); | 530 EXPECT_TRUE(permissions->HasAPIPermission(APIPermission::kCookie)); |
| 532 scoped_refptr<const PermissionSet> granted_permissions = | 531 scoped_ptr<const PermissionSet> granted_permissions = |
| 533 prefs->GetGrantedPermissions(extension->id()); | 532 prefs->GetGrantedPermissions(extension->id()); |
| 534 EXPECT_TRUE(granted_permissions->HasAPIPermission(APIPermission::kCookie)); | 533 EXPECT_TRUE(granted_permissions->HasAPIPermission(APIPermission::kCookie)); |
| 535 EXPECT_TRUE(updater.GetRevokablePermissions(extension.get()) | 534 EXPECT_TRUE(updater.GetRevokablePermissions(extension.get()) |
| 536 ->HasAPIPermission(APIPermission::kCookie)); | 535 ->HasAPIPermission(APIPermission::kCookie)); |
| 537 | 536 |
| 538 // Repeat with "tabs". | 537 // Repeat with "tabs". |
| 539 updater.AddPermissions(extension.get(), | 538 updater.AddPermissions(extension.get(), |
| 540 api_permission_set(APIPermission::kTab).get()); | 539 api_permission_set(APIPermission::kTab).get()); |
| 541 EXPECT_TRUE(permissions->HasAPIPermission(APIPermission::kTab)); | 540 EXPECT_TRUE(permissions->HasAPIPermission(APIPermission::kTab)); |
| 542 granted_permissions = prefs->GetGrantedPermissions(extension->id()); | 541 granted_permissions = prefs->GetGrantedPermissions(extension->id()); |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 614 ->active_permissions() | 613 ->active_permissions() |
| 615 ->HasExplicitAccessToOrigin(kOrigin)); | 614 ->HasExplicitAccessToOrigin(kOrigin)); |
| 616 EXPECT_TRUE(extension->permissions_data() | 615 EXPECT_TRUE(extension->permissions_data() |
| 617 ->withheld_permissions() | 616 ->withheld_permissions() |
| 618 ->HasExplicitAccessToOrigin(kOrigin)); | 617 ->HasExplicitAccessToOrigin(kOrigin)); |
| 619 EXPECT_TRUE(updater.GetRevokablePermissions(extension.get())->IsEmpty()); | 618 EXPECT_TRUE(updater.GetRevokablePermissions(extension.get())->IsEmpty()); |
| 620 } | 619 } |
| 621 } | 620 } |
| 622 | 621 |
| 623 } // namespace extensions | 622 } // namespace extensions |
| OLD | NEW |