| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "chrome/browser/extensions/permissions_based_management_policy_provider
.h" | 5 #include "chrome/browser/extensions/permissions_based_management_policy_provider
.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 #include <string> | 8 #include <string> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| 11 #include "base/logging.h" | 11 #include "base/logging.h" |
| 12 #include "base/memory/ref_counted.h" | 12 #include "base/memory/ref_counted.h" |
| 13 #include "base/strings/string16.h" | 13 #include "base/strings/string16.h" |
| 14 #include "base/values.h" | 14 #include "base/values.h" |
| 15 #include "chrome/browser/extensions/extension_management.h" | 15 #include "chrome/browser/extensions/extension_management.h" |
| 16 #include "chrome/browser/extensions/extension_management_test_util.h" | 16 #include "chrome/browser/extensions/extension_management_test_util.h" |
| 17 #include "chrome/common/extensions/permissions/chrome_api_permissions.h" | 17 #include "chrome/common/extensions/permissions/chrome_api_permissions.h" |
| 18 #include "components/prefs/pref_registry_simple.h" | 18 #include "chrome/test/base/testing_profile.h" |
| 19 #include "components/prefs/testing_pref_service.h" | 19 #include "components/sync_preferences/testing_pref_service_syncable.h" |
| 20 #include "content/public/test/test_browser_thread_bundle.h" |
| 20 #include "extensions/common/extension.h" | 21 #include "extensions/common/extension.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 "testing/gtest/include/gtest/gtest.h" | 25 #include "testing/gtest/include/gtest/gtest.h" |
| 25 | 26 |
| 26 namespace extensions { | 27 namespace extensions { |
| 27 | 28 |
| 28 class PermissionsBasedManagementPolicyProviderTest : public testing::Test { | 29 class PermissionsBasedManagementPolicyProviderTest : public testing::Test { |
| 29 public: | 30 protected: |
| 30 typedef ExtensionManagementPrefUpdater<TestingPrefServiceSimple> PrefUpdater; | 31 using PrefUpdater = ExtensionManagementPrefUpdater< |
| 32 sync_preferences::TestingPrefServiceSyncable>; |
| 31 | 33 |
| 32 PermissionsBasedManagementPolicyProviderTest() | 34 PermissionsBasedManagementPolicyProviderTest() |
| 33 : pref_service_(new TestingPrefServiceSimple()), | 35 : profile_(base::MakeUnique<TestingProfile>()), |
| 34 settings_(new ExtensionManagement(pref_service_.get())), | 36 settings_(base::MakeUnique<ExtensionManagement>(profile_.get())), |
| 37 pref_service_(profile_->GetTestingPrefService()), |
| 35 provider_(settings_.get()) {} | 38 provider_(settings_.get()) {} |
| 36 | 39 |
| 37 void SetUp() override { | 40 void SetUp() override { |
| 38 ChromeAPIPermissions api_permissions; | 41 ChromeAPIPermissions api_permissions; |
| 39 perm_list_ = api_permissions.GetAllPermissions(); | 42 perm_list_ = api_permissions.GetAllPermissions(); |
| 40 pref_service_->registry()->RegisterDictionaryPref( | |
| 41 pref_names::kExtensionManagement); | |
| 42 } | 43 } |
| 43 | 44 |
| 44 void TearDown() override {} | |
| 45 | |
| 46 // Get API permissions name for |id|, we cannot use arbitrary strings since | 45 // Get API permissions name for |id|, we cannot use arbitrary strings since |
| 47 // they will be ignored by ExtensionManagementService. | 46 // they will be ignored by ExtensionManagementService. |
| 48 std::string GetAPIPermissionName(APIPermission::ID id) { | 47 std::string GetAPIPermissionName(APIPermission::ID id) { |
| 49 for (const auto& perm : perm_list_) { | 48 for (const auto& perm : perm_list_) { |
| 50 if (perm->id() == id) | 49 if (perm->id() == id) |
| 51 return perm->name(); | 50 return perm->name(); |
| 52 } | 51 } |
| 53 ADD_FAILURE() << "Permission not found: " << id; | 52 ADD_FAILURE() << "Permission not found: " << id; |
| 54 return std::string(); | 53 return std::string(); |
| 55 } | 54 } |
| (...skipping 16 matching lines...) Expand all Loading... |
| 72 optional_permissions->DeepCopy()); | 71 optional_permissions->DeepCopy()); |
| 73 } | 72 } |
| 74 std::string error; | 73 std::string error; |
| 75 scoped_refptr<const Extension> extension = Extension::Create( | 74 scoped_refptr<const Extension> extension = Extension::Create( |
| 76 base::FilePath(), location, manifest_dict, Extension::NO_FLAGS, &error); | 75 base::FilePath(), location, manifest_dict, Extension::NO_FLAGS, &error); |
| 77 CHECK(extension.get()) << error; | 76 CHECK(extension.get()) << error; |
| 78 return extension; | 77 return extension; |
| 79 } | 78 } |
| 80 | 79 |
| 81 protected: | 80 protected: |
| 81 content::TestBrowserThreadBundle thread_bundle_; |
| 82 std::vector<std::unique_ptr<APIPermissionInfo>> perm_list_; | 82 std::vector<std::unique_ptr<APIPermissionInfo>> perm_list_; |
| 83 | 83 |
| 84 std::unique_ptr<TestingPrefServiceSimple> pref_service_; | 84 std::unique_ptr<TestingProfile> profile_; |
| 85 std::unique_ptr<ExtensionManagement> settings_; | 85 std::unique_ptr<ExtensionManagement> settings_; |
| 86 sync_preferences::TestingPrefServiceSyncable* pref_service_ = nullptr; |
| 86 | 87 |
| 87 PermissionsBasedManagementPolicyProvider provider_; | 88 PermissionsBasedManagementPolicyProvider provider_; |
| 88 }; | 89 }; |
| 89 | 90 |
| 90 // Verifies that extensions with conflicting permissions cannot be loaded. | 91 // Verifies that extensions with conflicting permissions cannot be loaded. |
| 91 TEST_F(PermissionsBasedManagementPolicyProviderTest, APIPermissions) { | 92 TEST_F(PermissionsBasedManagementPolicyProviderTest, APIPermissions) { |
| 92 // Prepares the extension manifest. | 93 // Prepares the extension manifest. |
| 93 base::ListValue required_permissions; | 94 base::ListValue required_permissions; |
| 94 required_permissions.AppendString( | 95 required_permissions.AppendString( |
| 95 GetAPIPermissionName(APIPermission::kDownloads)); | 96 GetAPIPermissionName(APIPermission::kDownloads)); |
| 96 required_permissions.AppendString( | 97 required_permissions.AppendString( |
| 97 GetAPIPermissionName(APIPermission::kCookie)); | 98 GetAPIPermissionName(APIPermission::kCookie)); |
| 98 base::ListValue optional_permissions; | 99 base::ListValue optional_permissions; |
| 99 optional_permissions.AppendString( | 100 optional_permissions.AppendString( |
| 100 GetAPIPermissionName(APIPermission::kProxy)); | 101 GetAPIPermissionName(APIPermission::kProxy)); |
| 101 | 102 |
| 102 scoped_refptr<const Extension> extension = | 103 scoped_refptr<const Extension> extension = |
| 103 CreateExtensionWithPermission(Manifest::EXTERNAL_POLICY_DOWNLOAD, | 104 CreateExtensionWithPermission(Manifest::EXTERNAL_POLICY_DOWNLOAD, |
| 104 &required_permissions, | 105 &required_permissions, |
| 105 &optional_permissions); | 106 &optional_permissions); |
| 106 | 107 |
| 107 base::string16 error16; | 108 base::string16 error16; |
| 108 // The extension should be allowed to be loaded by default. | 109 // The extension should be allowed to be loaded by default. |
| 109 error16.clear(); | 110 error16.clear(); |
| 110 EXPECT_TRUE(provider_.UserMayLoad(extension.get(), &error16)); | 111 EXPECT_TRUE(provider_.UserMayLoad(extension.get(), &error16)); |
| 111 EXPECT_TRUE(error16.empty()); | 112 EXPECT_TRUE(error16.empty()); |
| 112 | 113 |
| 113 // Blocks kProxy by default. The test extension should still be allowed. | 114 // Blocks kProxy by default. The test extension should still be allowed. |
| 114 { | 115 { |
| 115 PrefUpdater pref(pref_service_.get()); | 116 PrefUpdater pref(pref_service_); |
| 116 pref.AddBlockedPermission("*", | 117 pref.AddBlockedPermission("*", |
| 117 GetAPIPermissionName(APIPermission::kProxy)); | 118 GetAPIPermissionName(APIPermission::kProxy)); |
| 118 } | 119 } |
| 119 error16.clear(); | 120 error16.clear(); |
| 120 EXPECT_TRUE(provider_.UserMayLoad(extension.get(), &error16)); | 121 EXPECT_TRUE(provider_.UserMayLoad(extension.get(), &error16)); |
| 121 EXPECT_TRUE(error16.empty()); | 122 EXPECT_TRUE(error16.empty()); |
| 122 | 123 |
| 123 // Blocks kCookie this time. The test extension should not be allowed now. | 124 // Blocks kCookie this time. The test extension should not be allowed now. |
| 124 { | 125 { |
| 125 PrefUpdater pref(pref_service_.get()); | 126 PrefUpdater pref(pref_service_); |
| 126 pref.AddBlockedPermission("*", | 127 pref.AddBlockedPermission("*", |
| 127 GetAPIPermissionName(APIPermission::kCookie)); | 128 GetAPIPermissionName(APIPermission::kCookie)); |
| 128 } | 129 } |
| 129 error16.clear(); | 130 error16.clear(); |
| 130 EXPECT_FALSE(provider_.UserMayLoad(extension.get(), &error16)); | 131 EXPECT_FALSE(provider_.UserMayLoad(extension.get(), &error16)); |
| 131 EXPECT_FALSE(error16.empty()); | 132 EXPECT_FALSE(error16.empty()); |
| 132 | 133 |
| 133 // Explictly allows kCookie for test extension. It should be allowed again. | 134 // Explictly allows kCookie for test extension. It should be allowed again. |
| 134 { | 135 { |
| 135 PrefUpdater pref(pref_service_.get()); | 136 PrefUpdater pref(pref_service_); |
| 136 pref.AddAllowedPermission(extension->id(), | 137 pref.AddAllowedPermission(extension->id(), |
| 137 GetAPIPermissionName(APIPermission::kCookie)); | 138 GetAPIPermissionName(APIPermission::kCookie)); |
| 138 } | 139 } |
| 139 error16.clear(); | 140 error16.clear(); |
| 140 EXPECT_TRUE(provider_.UserMayLoad(extension.get(), &error16)); | 141 EXPECT_TRUE(provider_.UserMayLoad(extension.get(), &error16)); |
| 141 EXPECT_TRUE(error16.empty()); | 142 EXPECT_TRUE(error16.empty()); |
| 142 | 143 |
| 143 // Explictly blocks kCookie for test extension. It should be blocked again. | 144 // Explictly blocks kCookie for test extension. It should be blocked again. |
| 144 { | 145 { |
| 145 PrefUpdater pref(pref_service_.get()); | 146 PrefUpdater pref(pref_service_); |
| 146 pref.AddBlockedPermission(extension->id(), | 147 pref.AddBlockedPermission(extension->id(), |
| 147 GetAPIPermissionName(APIPermission::kCookie)); | 148 GetAPIPermissionName(APIPermission::kCookie)); |
| 148 } | 149 } |
| 149 error16.clear(); | 150 error16.clear(); |
| 150 EXPECT_FALSE(provider_.UserMayLoad(extension.get(), &error16)); | 151 EXPECT_FALSE(provider_.UserMayLoad(extension.get(), &error16)); |
| 151 EXPECT_FALSE(error16.empty()); | 152 EXPECT_FALSE(error16.empty()); |
| 152 | 153 |
| 153 // Blocks kDownloads by default. It should be blocked. | 154 // Blocks kDownloads by default. It should be blocked. |
| 154 { | 155 { |
| 155 PrefUpdater pref(pref_service_.get()); | 156 PrefUpdater pref(pref_service_); |
| 156 pref.UnsetBlockedPermissions(extension->id()); | 157 pref.UnsetBlockedPermissions(extension->id()); |
| 157 pref.UnsetAllowedPermissions(extension->id()); | 158 pref.UnsetAllowedPermissions(extension->id()); |
| 158 pref.ClearBlockedPermissions("*"); | 159 pref.ClearBlockedPermissions("*"); |
| 159 pref.AddBlockedPermission("*", | 160 pref.AddBlockedPermission("*", |
| 160 GetAPIPermissionName(APIPermission::kDownloads)); | 161 GetAPIPermissionName(APIPermission::kDownloads)); |
| 161 } | 162 } |
| 162 error16.clear(); | 163 error16.clear(); |
| 163 EXPECT_FALSE(provider_.UserMayLoad(extension.get(), &error16)); | 164 EXPECT_FALSE(provider_.UserMayLoad(extension.get(), &error16)); |
| 164 EXPECT_FALSE(error16.empty()); | 165 EXPECT_FALSE(error16.empty()); |
| 165 } | 166 } |
| 166 | 167 |
| 167 } // namespace extensions | 168 } // namespace extensions |
| OLD | NEW |