1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/browser/management_policy.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions { 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GetExtensionNameAndId(const Extension* extension, 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string* name, 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string* id) { 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The extension may be NULL in testing. 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *id = extension ? extension->id() : "[test]"; 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *name = extension ? extension->name() : "test"; 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ManagementPolicy::ManagementPolicy() { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ManagementPolicy::~ManagementPolicy() { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ManagementPolicy::Provider::UserMayLoad(const Extension* extension, 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16* error) const { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ManagementPolicy::Provider::UserMayModifySettings( 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const Extension* extension, base::string16* error) const { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ManagementPolicy::Provider::MustRemainEnabled(const Extension* extension, 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16* error) 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool ManagementPolicy::Provider::MustRemainDisabled( 44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const Extension* extension, 45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Extension::DisableReason* reason, 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16* error) const { 47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return false; 48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ManagementPolicy::RegisterProvider(Provider* provider) { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) providers_.insert(provider); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ManagementPolicy::UnregisterProvider(Provider* provider) { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) providers_.erase(provider); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ManagementPolicy::UserMayLoad(const Extension* extension, 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16* error) const { 600f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return ApplyToProviderList(&Provider::UserMayLoad, "Installation", 610f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) true, extension, error); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ManagementPolicy::UserMayModifySettings(const Extension* extension, 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16* error) const { 660f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return ApplyToProviderList(&Provider::UserMayModifySettings, "Modification", 670f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) true, extension, error); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ManagementPolicy::MustRemainEnabled(const Extension* extension, 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16* error) const { 720f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return ApplyToProviderList(&Provider::MustRemainEnabled, "Disabling", 730f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) false, extension, error); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool ManagementPolicy::MustRemainDisabled(const Extension* extension, 77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Extension::DisableReason* reason, 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16* error) const { 79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (ProviderList::const_iterator it = providers_.begin(); 80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) it != providers_.end(); ++it) 81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if ((*it)->MustRemainDisabled(extension, reason, error)) 82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return true; 83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return false; 85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ManagementPolicy::UnregisterAllProviders() { 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) providers_.clear(); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ManagementPolicy::GetNumProviders() const { 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return providers_.size(); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 950f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)bool ManagementPolicy::ApplyToProviderList(ProviderFunction function, 960f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) const char* debug_operation_name, 970f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) bool normal_result, 980f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) const Extension* extension, 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16* error) const { 1000f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) for (ProviderList::const_iterator it = providers_.begin(); 1010f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) it != providers_.end(); ++it) { 1020f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) const Provider* provider = *it; 1030f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) bool result = (provider->*function)(extension, error); 1040f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (result != normal_result) { 1050f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) std::string id; 1060f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) std::string name; 1070f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) GetExtensionNameAndId(extension, &name, &id); 1080f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) DVLOG(1) << debug_operation_name << " of extension " << name 1090f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) << " (" << id << ")" 1100f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) << " prohibited by " << provider->GetDebugPolicyProviderName(); 1110f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return !normal_result; 1120f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) } 1130f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) } 1140f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return normal_result; 1150f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)} 1160f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace extensions 118