diff options
Diffstat (limited to 'chrome/browser/extensions/permissions_based_management_policy_provider_unittest.cc')
-rw-r--r-- | chrome/browser/extensions/permissions_based_management_policy_provider_unittest.cc | 169 |
1 files changed, 169 insertions, 0 deletions
diff --git a/chrome/browser/extensions/permissions_based_management_policy_provider_unittest.cc b/chrome/browser/extensions/permissions_based_management_policy_provider_unittest.cc new file mode 100644 index 0000000..e7eacfd --- /dev/null +++ b/chrome/browser/extensions/permissions_based_management_policy_provider_unittest.cc @@ -0,0 +1,169 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include <string> +#include <vector> + +#include "base/logging.h" +#include "base/memory/ref_counted.h" +#include "base/memory/scoped_ptr.h" +#include "base/prefs/pref_registry_simple.h" +#include "base/prefs/testing_pref_service.h" +#include "base/stl_util.h" +#include "base/strings/string16.h" +#include "base/values.h" +#include "chrome/browser/extensions/extension_management.h" +#include "chrome/browser/extensions/extension_management_test_util.h" +#include "chrome/browser/extensions/permissions_based_management_policy_provider.h" +#include "chrome/common/extensions/permissions/chrome_api_permissions.h" +#include "extensions/common/extension.h" +#include "extensions/common/manifest.h" +#include "extensions/common/manifest_constants.h" +#include "extensions/common/permissions/api_permission.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace extensions { + +class PermissionsBasedManagementPolicyProviderTest : public testing::Test { + public: + typedef ExtensionManagementPrefUpdater<TestingPrefServiceSimple> PrefUpdater; + + PermissionsBasedManagementPolicyProviderTest() + : pref_service_(new TestingPrefServiceSimple()), + settings_(new ExtensionManagement(pref_service_.get())), + provider_(settings_.get()) {} + + void SetUp() override { + ChromeAPIPermissions api_permissions; + perm_list_ = api_permissions.GetAllPermissions(); + pref_service_->registry()->RegisterDictionaryPref( + pref_names::kExtensionManagement); + } + + void TearDown() override { + STLDeleteElements(&perm_list_); + } + + // Get API permissions name for |id|, we cannot use arbitrary strings since + // they will be ignored by ExtensionManagementService. + std::string GetAPIPermissionName(APIPermission::ID id) { + for (const auto& perm : perm_list_) { + if (perm->id() == id) + return perm->name(); + } + ADD_FAILURE() << "Permission not found: " << id; + return std::string(); + } + + // Create an extension with specified |location|, |required_permissions| and + // |optional_permissions|. + scoped_refptr<const Extension> CreateExtensionWithPermission( + Manifest::Location location, + const base::ListValue* required_permissions, + const base::ListValue* optional_permissions) { + base::DictionaryValue manifest_dict; + manifest_dict.SetString(manifest_keys::kName, "test"); + manifest_dict.SetString(manifest_keys::kVersion, "0.1"); + if (required_permissions) { + manifest_dict.Set(manifest_keys::kPermissions, + required_permissions->DeepCopy()); + } + if (optional_permissions) { + manifest_dict.Set(manifest_keys::kOptionalPermissions, + optional_permissions->DeepCopy()); + } + std::string error; + scoped_refptr<const Extension> extension = Extension::Create( + base::FilePath(), location, manifest_dict, Extension::NO_FLAGS, &error); + CHECK(extension.get()) << error; + return extension; + } + + protected: + std::vector<APIPermissionInfo*> perm_list_; + + scoped_ptr<TestingPrefServiceSimple> pref_service_; + scoped_ptr<ExtensionManagement> settings_; + + PermissionsBasedManagementPolicyProvider provider_; +}; + +// Verifies that extensions with conflicting permissions cannot be loaded. +TEST_F(PermissionsBasedManagementPolicyProviderTest, APIPermissions) { + // Prepares the extension manifest. + base::ListValue required_permissions; + required_permissions.AppendString( + GetAPIPermissionName(APIPermission::kDownloads)); + required_permissions.AppendString( + GetAPIPermissionName(APIPermission::kCookie)); + base::ListValue optional_permissions; + optional_permissions.AppendString( + GetAPIPermissionName(APIPermission::kProxy)); + + scoped_refptr<const Extension> extension = + CreateExtensionWithPermission(Manifest::EXTERNAL_POLICY_DOWNLOAD, + &required_permissions, + &optional_permissions); + + base::string16 error16; + // The extension should be allowed to be loaded by default. + error16.clear(); + EXPECT_TRUE(provider_.UserMayLoad(extension.get(), &error16)); + EXPECT_TRUE(error16.empty()); + + // Blocks kProxy by default. The test extension should still be allowed. + { + PrefUpdater pref(pref_service_.get()); + pref.AddBlockedPermission("*", + GetAPIPermissionName(APIPermission::kProxy)); + } + error16.clear(); + EXPECT_TRUE(provider_.UserMayLoad(extension.get(), &error16)); + EXPECT_TRUE(error16.empty()); + + // Blocks kCookie this time. The test extension should not be allowed now. + { + PrefUpdater pref(pref_service_.get()); + pref.AddBlockedPermission("*", + GetAPIPermissionName(APIPermission::kCookie)); + } + error16.clear(); + EXPECT_FALSE(provider_.UserMayLoad(extension.get(), &error16)); + EXPECT_FALSE(error16.empty()); + + // Explictly allows kCookie for test extension. It should be allowed again. + { + PrefUpdater pref(pref_service_.get()); + pref.AddAllowedPermission(extension->id(), + GetAPIPermissionName(APIPermission::kCookie)); + } + error16.clear(); + EXPECT_TRUE(provider_.UserMayLoad(extension.get(), &error16)); + EXPECT_TRUE(error16.empty()); + + // Explictly blocks kCookie for test extension. It should be blocked again. + { + PrefUpdater pref(pref_service_.get()); + pref.AddBlockedPermission(extension->id(), + GetAPIPermissionName(APIPermission::kCookie)); + } + error16.clear(); + EXPECT_FALSE(provider_.UserMayLoad(extension.get(), &error16)); + EXPECT_FALSE(error16.empty()); + + // Blocks kDownloads by default. It should be blocked. + { + PrefUpdater pref(pref_service_.get()); + pref.UnsetBlockedPermissions(extension->id()); + pref.UnsetAllowedPermissions(extension->id()); + pref.ClearBlockedPermissions("*"); + pref.AddBlockedPermission("*", + GetAPIPermissionName(APIPermission::kDownloads)); + } + error16.clear(); + EXPECT_FALSE(provider_.UserMayLoad(extension.get(), &error16)); + EXPECT_FALSE(error16.empty()); +} + +} // namespace extensions |