summaryrefslogtreecommitdiffstats
path: root/chrome/browser/group_policy.h
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/group_policy.h')
-rw-r--r--chrome/browser/group_policy.h157
1 files changed, 157 insertions, 0 deletions
diff --git a/chrome/browser/group_policy.h b/chrome/browser/group_policy.h
new file mode 100644
index 0000000..2c06d0a
--- /dev/null
+++ b/chrome/browser/group_policy.h
@@ -0,0 +1,157 @@
+// Copyright (c) 2009 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.
+//
+// A central repository for definitions relating to Group Policy.
+
+#ifndef CHROME_BROWSER_GROUP_POLICY_H_
+#define CHROME_BROWSER_GROUP_POLICY_H_
+
+#include <windows.h>
+#include "base/basictypes.h"
+#include "base/logging.h"
+#include "base/values.h"
+#include "build/build_config.h"
+
+// Each policy:
+// - has a name; this is used to refer to the policy for testing in code.
+// - has a type; the type of a policy decides what sort of value a policy
+// lookup returns as well as how the policy handles it when it is
+// defined both in user and machine policy.
+// Policy types include:
+// # Flag; a boolean flag, if either machine or user instance
+// of the flag is nonzero, then the flag is set. Otherwise,
+// whether both or either are nonexistent or zero, the flag
+// is unset.
+// # Number; a DWORD number.
+// # String; a character string.
+// # String List; an unordered list of strings.
+// - belongs to class; Each policy is either a machine or a user policy
+// or both.
+// Policies that belong to the user class are stored under HKCU, while
+// those of machine class are stored under HKLM. Policies of class both
+// belong in both places. For such policies, the meaning of
+// conflicting settings is determined by the type of the policy.
+// - has a registry key; This is a path from the toplevel key or keys that
+// the policy class implies.
+// - has a value name; Depending on the type of the policy, this is the name
+// of the value or the subkey that contains the policy flag or value.
+// - has a display name; this is the name displayed to the administrator in
+// the group policy editor.
+// - has a help string; this is the help string displayed to the administrator
+// in the group policy editor.
+
+namespace group_policy {
+
+// Get the root registry location of group policy settings.
+bool GetPolicySettingsRootKey(std::wstring* policy_key);
+
+// Check if the machine has any group policy settings.
+bool HasGroupPolicySettings();
+
+// True if the machine has group policy settings in HKCU.
+bool HasHkcuSettings();
+
+// True if the machine has group policy settings in HKLM.
+bool HasHklmSettings();
+
+// This specifies how to combine the user and machine keys for the
+// policy setting; some are only applicable to certain data types
+// and/or certain storage types. Add more as needed.
+enum PolicyCombine {
+ POLICYCOMBINE_PREFERMACHINE, // HKLM policy takes priority.
+ POLICYCOMBINE_PREFERUSER, // HKCU policy takes priority.
+ POLICYCOMBINE_CONCATENATE, // Concatenate both policies.
+ POLICYCOMBINE_LOGICALOR, // Logical OR of both keys.
+};
+
+// This specifies how the policy setting is stored in the registry.
+// Add more as needed.
+enum PolicyStorage {
+ POLICYSTORAGE_SINGLEVALUE, // Policy is a single registry value.
+ POLICYSTORAGE_CONCATSUBKEYS, // Policy is set of subkeys of specified key.
+};
+
+// Class that represents a group policy setting. Encapsulates the lookup
+// from both policy sections of the registry, as well as the method for
+// combining values in the two policy sections.
+class SettingBase {
+ public:
+ SettingBase(const wchar_t* regkey,
+ const wchar_t* regvalue,
+ PolicyStorage storage,
+ PolicyCombine combine) : regkey_(regkey),
+ regvalue_(regvalue), storage_(storage),
+ combine_(combine) {
+ // Both parameters are required. Either can be empty (but not both.)
+ DCHECK(regkey != NULL);
+ DCHECK(regvalue != NULL);
+ DCHECK(regkey[0] != L'\0' || regvalue[0] != L'\0');
+
+ // If storage is POLICYSTORAGE_CONCATSUBKEYS, regvalue should be empty.
+ DCHECK((storage != POLICYSTORAGE_CONCATSUBKEYS) ||
+ regvalue[0] == L'\0');
+ }
+
+ // Returns whether this setting is controlled by group policy;
+ // indicates whether this value is set somewhere in the registry.
+ bool IsPolicyControlled() const;
+
+ protected:
+ // These accessors are protected and then individually exposed in a
+ // templated base class. That lets the compiler enforce that the code
+ // using a policy is using the appropriate data type.
+ HRESULT GetSetting(std::wstring* value, bool* found) const;
+ HRESULT GetSetting(ListValue* list, bool* found) const;
+ HRESULT GetSetting(DWORD* value, bool* found) const;
+ HRESULT GetSetting(bool* value, bool* found) const;
+ const wchar_t* regkey_;
+ const wchar_t* regvalue_;
+
+ private:
+ // Private helper accessors for pulling individual registry keys
+ HRESULT GetSettingFromTree(HKEY tree, std::wstring* value, bool* found) const;
+ HRESULT GetSettingFromTree(HKEY tree, ListValue* value, bool* found) const;
+ HRESULT GetSettingFromTree(HKEY tree, DWORD* value, bool* found) const;
+ HRESULT GetSettingFromTree(HKEY tree, bool* value, bool* found) const;
+
+ PolicyStorage storage_;
+ PolicyCombine combine_;
+};
+
+// Templated class to provide type-safe access to policy setting.
+template <typename T>
+class Setting : public SettingBase {
+ public:
+ Setting(const wchar_t* regkey,
+ const wchar_t* regvalue,
+ PolicyStorage storage,
+ PolicyCombine combine) :
+ SettingBase(regkey, regvalue, storage, combine) {
+ }
+
+ HRESULT GetSetting(T* value, bool* found) const {
+ DCHECK(found);
+ DCHECK(value);
+ DCHECK(regvalue_ != NULL && regkey_ != NULL) <<
+ "Setting not initialized - don't call at static init time!";
+
+ *found = false;
+
+ if (!HasGroupPolicySettings())
+ return S_OK;
+
+ return SettingBase::GetSetting(value, found);
+ }
+};
+
+// Is option set, default is 'no'.
+bool IsBoolOptionSet(const Setting<bool>& setting);
+
+// Helper function for appending all of one ListValue to another.
+void AppendAll(ListValue* target, ListValue* source);
+
+} // namespace
+
+#endif // CHROME_BROWSER_GROUP_POLICY_H_
+