13f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Use of this source code is governed by a BSD-style license that can be 3bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// found in the LICENSE file. 4bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 5bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#ifndef CHROME_BROWSER_POLICY_CONFIGURATION_POLICY_PROVIDER_H_ 6bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#define CHROME_BROWSER_POLICY_CONFIGURATION_POLICY_PROVIDER_H_ 7bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#pragma once 8bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 9dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include <map> 10513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include <string> 11bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 12bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/basictypes.h" 13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h" 14bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/values.h" 15513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/policy/configuration_policy_store_interface.h" 16dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "policy/configuration_policy_type.h" 17bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 18bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsennamespace policy { 19bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 20dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass PolicyMap; 21dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 22bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// A mostly-abstract super class for platform-specific policy providers. 23bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Platform-specific policy providers (Windows Group Policy, gconf, 24bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// etc.) should implement a subclass of this class. 25bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenclass ConfigurationPolicyProvider { 26bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen public: 2721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen class Observer { 2821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen public: 2921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual ~Observer() {} 3021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual void OnUpdatePolicy() = 0; 313f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen virtual void OnProviderGoingAway() = 0; 3221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen }; 3321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 34bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Used for static arrays of policy values that is used to initialize an 35bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // instance of the ConfigurationPolicyProvider. 36513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch struct PolicyDefinitionList { 37bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen struct Entry { 38513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ConfigurationPolicyType policy_type; 39bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen Value::ValueType value_type; 40bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const char* name; 41bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen }; 42bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 43513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const Entry* begin; 44513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const Entry* end; 45bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen }; 46bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 47513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch explicit ConfigurationPolicyProvider(const PolicyDefinitionList* policy_list); 48bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 49731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick virtual ~ConfigurationPolicyProvider(); 50bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 5121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Must be implemented by provider subclasses to specify the provider-specific 5221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // policy decisions. The preference service invokes this |Provide| method when 5321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // it needs a policy provider to specify its policy choices. In |Provide|, the 5421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // |ConfigurationPolicyProvider| must make calls to the |Apply| method of 5521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // |store| to apply specific policies. Returns true if the policy could be 5621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // provided, otherwise false. 57513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch virtual bool Provide(ConfigurationPolicyStoreInterface* store) = 0; 58bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 5921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Check whether this provider has completed initialization. This is used to 6021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // detect whether initialization is done in case providers implementations 6121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // need to do asynchronous operations for initialization. 6272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen virtual bool IsInitializationComplete() const; 63bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 6421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen protected: 654a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Decodes the value tree and writes the configuration to the given |store|. 66dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen void ApplyPolicyValueTree(const DictionaryValue* policies, 674a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch ConfigurationPolicyStoreInterface* store); 6821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 69dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Writes the configuration found in the already-decoded map |policies| to 70dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // the given |store|. 71dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen void ApplyPolicyMap(const PolicyMap* policies, 72dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen ConfigurationPolicyStoreInterface* store); 73dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 74513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const PolicyDefinitionList* policy_definition_list() const { 75513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return policy_definition_list_; 76bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 77bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 78bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen private: 7921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen friend class ConfigurationPolicyObserverRegistrar; 8021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Temporarily needed for access to ApplyPolicyValueTree as long as we need 82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // to support old-style policy. 83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen friend class UserPolicyCache; 84ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 8521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual void AddObserver(ConfigurationPolicyProvider::Observer* observer) = 0; 8621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual void RemoveObserver( 8721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ConfigurationPolicyProvider::Observer* observer) = 0; 8821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 89bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Contains the default mapping from policy values to the actual names. 90513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const ConfigurationPolicyProvider::PolicyDefinitionList* 91513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch policy_definition_list_; 92bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 93bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen private: 94bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DISALLOW_COPY_AND_ASSIGN(ConfigurationPolicyProvider); 95bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}; 96bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 9721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// Manages observers for a ConfigurationPolicyProvider. Is used to register 9821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// observers, and automatically removes them upon destruction. 993f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen// Implementation detail: to avoid duplicate bookkeeping of registered 1003f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen// observers, this registrar class acts as a proxy for notifications (since it 1013f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen// needs to register itself anyway to get OnProviderGoingAway notifications). 1023f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsenclass ConfigurationPolicyObserverRegistrar 1033f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen : ConfigurationPolicyProvider::Observer { 10421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen public: 10521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ConfigurationPolicyObserverRegistrar(); 10621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ~ConfigurationPolicyObserverRegistrar(); 1073f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen void Init(ConfigurationPolicyProvider* provider, 1083f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen ConfigurationPolicyProvider::Observer* observer); 1093f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen 1103f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // ConfigurationPolicyProvider::Observer implementation: 1113f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen virtual void OnUpdatePolicy(); 1123f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen virtual void OnProviderGoingAway(); 1133f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen 11421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen private: 11521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ConfigurationPolicyProvider* provider_; 1163f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen ConfigurationPolicyProvider::Observer* observer_; 1173f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen 11821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen DISALLOW_COPY_AND_ASSIGN(ConfigurationPolicyObserverRegistrar); 11921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}; 12021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 121bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} // namespace policy 122bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 123bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#endif // CHROME_BROWSER_POLICY_CONFIGURATION_POLICY_PROVIDER_H_ 124