// Copyright (c) 2012 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 "chrome/browser/extensions/admin_policy.h" #include "base/utf_string_conversions.h" #include "chrome/common/extensions/extension.h" #include "grit/generated_resources.h" #include "ui/base/l10n/l10n_util.h" namespace { bool IsRequired(const extensions::Extension* extension) { return extensions::Extension::IsRequired(extension->location()); } bool ManagementPolicyImpl(const extensions::Extension* extension, string16* error, bool modifiable_value) { bool modifiable = !IsRequired(extension); // Some callers equate "no restriction" to true, others to false. if (modifiable) return modifiable_value; if (error) { *error = l10n_util::GetStringFUTF16( IDS_EXTENSION_CANT_MODIFY_POLICY_REQUIRED, UTF8ToUTF16(extension->name())); } return !modifiable_value; } } // namespace namespace extensions { namespace admin_policy { bool BlacklistedByDefault(const base::ListValue* blacklist) { base::StringValue wildcard("*"); return blacklist && blacklist->Find(wildcard) != blacklist->end(); } bool UserMayLoad(bool is_google_blacklisted, const base::ListValue* blacklist, const base::ListValue* whitelist, const base::ListValue* forcelist, const Extension* extension, string16* error) { if (IsRequired(extension)) return true; if ((!blacklist || blacklist->empty()) && !is_google_blacklisted) return true; // Check the whitelist/forcelist first (takes precedence over Google // blacklist). base::StringValue id_value(extension->id()); if ((whitelist && whitelist->Find(id_value) != whitelist->end()) || (forcelist && forcelist->Find(id_value) != forcelist->end())) return true; // Then check both admin and Google blacklists. bool result = !is_google_blacklisted && (!blacklist || blacklist->Find(id_value) == blacklist->end()) && !BlacklistedByDefault(blacklist); if (error && !result) { *error = l10n_util::GetStringFUTF16( IDS_EXTENSION_CANT_INSTALL_POLICY_BLACKLIST, UTF8ToUTF16(extension->name()), UTF8ToUTF16(extension->id())); } return result; } bool UserMayModifySettings(const Extension* extension, string16* error) { return ManagementPolicyImpl(extension, error, true); } bool MustRemainEnabled(const Extension* extension, string16* error) { return ManagementPolicyImpl(extension, error, false); } } // namespace } // namespace