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