blob: bd87dc0751e2f56f8902ec2b796e18f275fb6fea [file] [log] [blame]
// 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.
#ifndef CHROME_BROWSER_POLICY_CONFIGURATION_POLICY_HANDLER_H_
#define CHROME_BROWSER_POLICY_CONFIGURATION_POLICY_HANDLER_H_
#include <string>
#include <vector>
#include "base/basictypes.h"
#include "base/memory/scoped_ptr.h"
#include "base/values.h"
#include "chrome/browser/prefs/incognito_mode_prefs.h"
#include "chrome/common/content_settings.h"
class PrefValueMap;
namespace policy {
class PolicyErrorMap;
class PolicyMap;
// An abstract super class that subclasses should implement to map policies to
// their corresponding preferences, and to check whether the policies are valid.
class ConfigurationPolicyHandler {
public:
static std::string ValueTypeToString(Value::Type type);
ConfigurationPolicyHandler();
virtual ~ConfigurationPolicyHandler();
// Returns whether the policy settings handled by this
// ConfigurationPolicyHandler can be applied. Fills |errors| with error
// messages or warnings. |errors| may contain error messages even when
// |CheckPolicySettings()| returns true.
virtual bool CheckPolicySettings(const PolicyMap& policies,
PolicyErrorMap* errors) = 0;
// Processes the policies handled by this ConfigurationPolicyHandler and sets
// the appropriate preferences in |prefs|.
virtual void ApplyPolicySettings(const PolicyMap& policies,
PrefValueMap* prefs) = 0;
// Modifies the values of some of the policies in |policies| so that they
// are more suitable to display to the user. This can be used to remove
// sensitive values such as passwords, or to pretty-print values.
// The base implementation just converts DictionaryValue policies to a
// StringValue representation.
virtual void PrepareForDisplaying(PolicyMap* policies) const;
private:
DISALLOW_COPY_AND_ASSIGN(ConfigurationPolicyHandler);
};
// Abstract class derived from ConfigurationPolicyHandler that should be
// subclassed to handle a single policy (not a combination of policies).
class TypeCheckingPolicyHandler : public ConfigurationPolicyHandler {
public:
TypeCheckingPolicyHandler(const char* policy_name,
base::Value::Type value_type);
// ConfigurationPolicyHandler methods:
virtual bool CheckPolicySettings(const PolicyMap& policies,
PolicyErrorMap* errors) OVERRIDE;
protected:
virtual ~TypeCheckingPolicyHandler();
// Runs policy checks and returns the policy value if successful.
bool CheckAndGetValue(const PolicyMap& policies,
PolicyErrorMap* errors,
const Value** value);
const char* policy_name() const;
private:
// The name of the policy.
const char* policy_name_;
// The type the value of the policy should have.
base::Value::Type value_type_;
DISALLOW_COPY_AND_ASSIGN(TypeCheckingPolicyHandler);
};
// Abstract class derived from TypeCheckingPolicyHandler that ensures an int
// policy's value lies in an allowed range. Either clamps or rejects values
// outside the range.
class IntRangePolicyHandlerBase : public TypeCheckingPolicyHandler {
public:
IntRangePolicyHandlerBase(const char* policy_name,
int min,
int max,
bool clamp);
// ConfigurationPolicyHandler:
virtual bool CheckPolicySettings(const PolicyMap& policies,
PolicyErrorMap* errors) OVERRIDE;
protected:
virtual ~IntRangePolicyHandlerBase();
// Ensures that the value is in the allowed range. Returns false if the value
// cannot be parsed or lies outside the allowed range and clamping is
// disabled.
bool EnsureInRange(const base::Value* input,
int* output,
PolicyErrorMap* errors);
private:
// The minimum value allowed.
int min_;
// The maximum value allowed.
int max_;
// Whether to clamp values lying outside the allowed range instead of
// rejecting them.
bool clamp_;
DISALLOW_COPY_AND_ASSIGN(IntRangePolicyHandlerBase);
};
// ConfigurationPolicyHandler for policies that map directly to a preference.
class SimplePolicyHandler : public TypeCheckingPolicyHandler {
public:
SimplePolicyHandler(const char* policy_name,
const char* pref_path,
base::Value::Type value_type);
virtual ~SimplePolicyHandler();
// ConfigurationPolicyHandler methods:
virtual void ApplyPolicySettings(const PolicyMap& policies,
PrefValueMap* prefs) OVERRIDE;
private:
// The DictionaryValue path of the preference the policy maps to.
const char* pref_path_;
DISALLOW_COPY_AND_ASSIGN(SimplePolicyHandler);
};
// A policy handler implementation that maps a string enum list to an int enum
// list as specified by a mapping table.
class StringToIntEnumListPolicyHandler : public TypeCheckingPolicyHandler {
public:
struct MappingEntry {
const char* enum_value;
int int_value;
};
StringToIntEnumListPolicyHandler(const char* policy_name,
const char* pref_path,
const MappingEntry* mapping_begin,
const MappingEntry* mapping_end);
// ConfigurationPolicyHandler methods:
virtual bool CheckPolicySettings(const PolicyMap& policies,
PolicyErrorMap* errors) OVERRIDE;
virtual void ApplyPolicySettings(const PolicyMap& policies,
PrefValueMap* prefs) OVERRIDE;
private:
// Attempts to convert the list in |input| to |output| according to the table,
// returns false on errors.
bool Convert(const base::Value* input,
base::ListValue* output,
PolicyErrorMap* errors);
// Name of the pref to write.
const char* pref_path_;
// The mapping table.
const MappingEntry* mapping_begin_;
const MappingEntry* mapping_end_;
DISALLOW_COPY_AND_ASSIGN(StringToIntEnumListPolicyHandler);
};
// A policy handler implementation that ensures an int policy's value lies in an
// allowed range.
class IntRangePolicyHandler : public IntRangePolicyHandlerBase {
public:
IntRangePolicyHandler(const char* policy_name,
const char* pref_path,
int min,
int max,
bool clamp);
virtual ~IntRangePolicyHandler();
// ConfigurationPolicyHandler:
virtual void ApplyPolicySettings(const PolicyMap& policies,
PrefValueMap* prefs) OVERRIDE;
private:
// Name of the pref to write.
const char* pref_path_;
DISALLOW_COPY_AND_ASSIGN(IntRangePolicyHandler);
};
// A policy handler implementation that maps an int percentage value to a
// double.
class IntPercentageToDoublePolicyHandler : public IntRangePolicyHandlerBase {
public:
IntPercentageToDoublePolicyHandler(const char* policy_name,
const char* pref_path,
int min,
int max,
bool clamp);
virtual ~IntPercentageToDoublePolicyHandler();
// ConfigurationPolicyHandler:
virtual void ApplyPolicySettings(const PolicyMap& policies,
PrefValueMap* prefs) OVERRIDE;
private:
// Name of the pref to write.
const char* pref_path_;
DISALLOW_COPY_AND_ASSIGN(IntPercentageToDoublePolicyHandler);
};
// Implements additional checks for policies that are lists of extension IDs.
class ExtensionListPolicyHandler : public TypeCheckingPolicyHandler {
public:
ExtensionListPolicyHandler(const char* policy_name,
const char* pref_path,
bool allow_wildcards);
virtual ~ExtensionListPolicyHandler();
// ConfigurationPolicyHandler methods:
virtual bool CheckPolicySettings(const PolicyMap& policies,
PolicyErrorMap* errors) OVERRIDE;
virtual void ApplyPolicySettings(const PolicyMap& policies,
PrefValueMap* prefs) OVERRIDE;
protected:
const char* pref_path() const;
// Runs sanity checks on the policy value and returns it in |extension_ids|.
bool CheckAndGetList(const PolicyMap& policies,
PolicyErrorMap* errors,
scoped_ptr<base::ListValue>* extension_ids);
private:
const char* pref_path_;
bool allow_wildcards_;
DISALLOW_COPY_AND_ASSIGN(ExtensionListPolicyHandler);
};
class ExtensionInstallForcelistPolicyHandler
: public TypeCheckingPolicyHandler {
public:
ExtensionInstallForcelistPolicyHandler();
virtual ~ExtensionInstallForcelistPolicyHandler();
// ConfigurationPolicyHandler methods:
virtual bool CheckPolicySettings(const PolicyMap& policies,
PolicyErrorMap* errors) OVERRIDE;
virtual void ApplyPolicySettings(const PolicyMap& policies,
PrefValueMap* prefs) OVERRIDE;
private:
// Parses the data in |policy_value| and writes them to |extension_dict|.
bool ParseList(const base::Value* policy_value,
base::DictionaryValue* extension_dict,
PolicyErrorMap* errors);
DISALLOW_COPY_AND_ASSIGN(ExtensionInstallForcelistPolicyHandler);
};
// Implements additional checks for policies that are lists of extension
// URLPatterns.
class ExtensionURLPatternListPolicyHandler : public TypeCheckingPolicyHandler {
public:
ExtensionURLPatternListPolicyHandler(const char* policy_name,
const char* pref_path);
virtual ~ExtensionURLPatternListPolicyHandler();
// ConfigurationPolicyHandler methods:
virtual bool CheckPolicySettings(const PolicyMap& policies,
PolicyErrorMap* errors) OVERRIDE;
virtual void ApplyPolicySettings(const PolicyMap& policies,
PrefValueMap* prefs) OVERRIDE;
private:
const char* pref_path_;
DISALLOW_COPY_AND_ASSIGN(ExtensionURLPatternListPolicyHandler);
};
// ConfigurationPolicyHandler for the SyncDisabled policy.
class SyncPolicyHandler : public TypeCheckingPolicyHandler {
public:
SyncPolicyHandler();
virtual ~SyncPolicyHandler();
// ConfigurationPolicyHandler methods:
virtual void ApplyPolicySettings(const PolicyMap& policies,
PrefValueMap* prefs) OVERRIDE;
private:
DISALLOW_COPY_AND_ASSIGN(SyncPolicyHandler);
};
// ConfigurationPolicyHandler for the AutofillEnabled policy.
class AutofillPolicyHandler : public TypeCheckingPolicyHandler {
public:
AutofillPolicyHandler();
virtual ~AutofillPolicyHandler();
// ConfigurationPolicyHandler methods:
virtual void ApplyPolicySettings(const PolicyMap& policies,
PrefValueMap* prefs) OVERRIDE;
private:
DISALLOW_COPY_AND_ASSIGN(AutofillPolicyHandler);
};
#if !defined(OS_ANDROID)
// ConfigurationPolicyHandler for the DownloadDirectory policy.
class DownloadDirPolicyHandler : public TypeCheckingPolicyHandler {
public:
DownloadDirPolicyHandler();
virtual ~DownloadDirPolicyHandler();
// ConfigurationPolicyHandler methods:
virtual void ApplyPolicySettings(const PolicyMap& policies,
PrefValueMap* prefs) OVERRIDE;
private:
DISALLOW_COPY_AND_ASSIGN(DownloadDirPolicyHandler);
};
// ConfigurationPolicyHandler for the DiskCacheDir policy.
class DiskCacheDirPolicyHandler : public TypeCheckingPolicyHandler {
public:
explicit DiskCacheDirPolicyHandler();
virtual ~DiskCacheDirPolicyHandler();
// ConfigurationPolicyHandler methods:
virtual void ApplyPolicySettings(const PolicyMap& policies,
PrefValueMap* prefs) OVERRIDE;
private:
DISALLOW_COPY_AND_ASSIGN(DiskCacheDirPolicyHandler);
};
#endif // !defined(OS_ANDROID)
// ConfigurationPolicyHandler for the FileSelectionDialogsHandler policy.
class FileSelectionDialogsHandler : public TypeCheckingPolicyHandler {
public:
FileSelectionDialogsHandler();
virtual ~FileSelectionDialogsHandler();
// ConfigurationPolicyHandler methods:
virtual void ApplyPolicySettings(const PolicyMap& policies,
PrefValueMap* prefs) OVERRIDE;
private:
DISALLOW_COPY_AND_ASSIGN(FileSelectionDialogsHandler);
};
// ConfigurationPolicyHandler for the incognito mode policies.
class IncognitoModePolicyHandler : public ConfigurationPolicyHandler {
public:
IncognitoModePolicyHandler();
virtual ~IncognitoModePolicyHandler();
// ConfigurationPolicyHandler methods:
virtual bool CheckPolicySettings(const PolicyMap& policies,
PolicyErrorMap* errors) OVERRIDE;
virtual void ApplyPolicySettings(const PolicyMap& policies,
PrefValueMap* prefs) OVERRIDE;
private:
IncognitoModePrefs::Availability GetAvailabilityValueAsEnum(
const Value* availability);
DISALLOW_COPY_AND_ASSIGN(IncognitoModePolicyHandler);
};
// ConfigurationPolicyHandler for the DefaultSearchEncodings policy.
class DefaultSearchEncodingsPolicyHandler : public TypeCheckingPolicyHandler {
public:
DefaultSearchEncodingsPolicyHandler();
virtual ~DefaultSearchEncodingsPolicyHandler();
// ConfigurationPolicyHandler methods:
virtual void ApplyPolicySettings(const PolicyMap& policies,
PrefValueMap* prefs) OVERRIDE;
private:
DISALLOW_COPY_AND_ASSIGN(DefaultSearchEncodingsPolicyHandler);
};
// ConfigurationPolicyHandler for the default search policies.
class DefaultSearchPolicyHandler : public ConfigurationPolicyHandler {
public:
DefaultSearchPolicyHandler();
virtual ~DefaultSearchPolicyHandler();
// ConfigurationPolicyHandler methods:
virtual bool CheckPolicySettings(const PolicyMap& policies,
PolicyErrorMap* errors) OVERRIDE;
virtual void ApplyPolicySettings(const PolicyMap& policies,
PrefValueMap* prefs) OVERRIDE;
private:
// Calls |CheckPolicySettings()| on each of the handlers in |handlers_|
// and returns whether all of the calls succeeded.
bool CheckIndividualPolicies(const PolicyMap& policies,
PolicyErrorMap* errors);
// Returns whether there is a value for |policy_name| in |policies|.
bool HasDefaultSearchPolicy(const PolicyMap& policies,
const char* policy_name);
// Returns whether any default search policies are specified in |policies|.
bool AnyDefaultSearchPoliciesSpecified(const PolicyMap& policies);
// Returns whether the default search provider is disabled.
bool DefaultSearchProviderIsDisabled(const PolicyMap& policies);
// Returns whether the default search URL is set and valid. On success, both
// outparams (which must be non-NULL) are filled with the search URL.
bool DefaultSearchURLIsValid(const PolicyMap& policies,
const Value** url_value,
std::string* url_string);
// Make sure that the |path| is present in |prefs_|. If not, set it to
// a blank string.
void EnsureStringPrefExists(PrefValueMap* prefs, const std::string& path);
// Make sure that the |path| is present in |prefs_| and is a ListValue. If
// not, set it to an empty list.
void EnsureListPrefExists(PrefValueMap* prefs, const std::string& path);
// The ConfigurationPolicyHandler handlers for each default search policy.
std::vector<ConfigurationPolicyHandler*> handlers_;
DISALLOW_COPY_AND_ASSIGN(DefaultSearchPolicyHandler);
};
// ConfigurationPolicyHandler for the proxy policies.
class ProxyPolicyHandler : public ConfigurationPolicyHandler {
public:
// Constants for the "Proxy Server Mode" defined in the policies.
// Note that these diverge from internal presentation defined in
// ProxyPrefs::ProxyMode for legacy reasons. The following four
// PolicyProxyModeType types were not very precise and had overlapping use
// cases.
enum ProxyModeType {
// Disable Proxy, connect directly.
PROXY_SERVER_MODE = 0,
// Auto detect proxy or use specific PAC script if given.
PROXY_AUTO_DETECT_PROXY_SERVER_MODE = 1,
// Use manually configured proxy servers (fixed servers).
PROXY_MANUALLY_CONFIGURED_PROXY_SERVER_MODE = 2,
// Use system proxy server.
PROXY_USE_SYSTEM_PROXY_SERVER_MODE = 3,
MODE_COUNT
};
ProxyPolicyHandler();
virtual ~ProxyPolicyHandler();
// ConfigurationPolicyHandler methods:
virtual bool CheckPolicySettings(const PolicyMap& policies,
PolicyErrorMap* errors) OVERRIDE;
virtual void ApplyPolicySettings(const PolicyMap& policies,
PrefValueMap* prefs) OVERRIDE;
private:
const Value* GetProxyPolicyValue(const PolicyMap& policies,
const char* policy_name);
// Converts the deprecated ProxyServerMode policy value to a ProxyMode value
// and places the result in |mode_value|. Returns whether the conversion
// succeeded.
bool CheckProxyModeAndServerMode(const PolicyMap& policies,
PolicyErrorMap* errors,
std::string* mode_value);
DISALLOW_COPY_AND_ASSIGN(ProxyPolicyHandler);
};
// Handles JavaScript policies.
class JavascriptPolicyHandler : public ConfigurationPolicyHandler {
public:
JavascriptPolicyHandler();
virtual ~JavascriptPolicyHandler();
// ConfigurationPolicyHandler methods:
virtual bool CheckPolicySettings(const PolicyMap& policies,
PolicyErrorMap* errors) OVERRIDE;
virtual void ApplyPolicySettings(const PolicyMap& policies,
PrefValueMap* prefs) OVERRIDE;
private:
DISALLOW_COPY_AND_ASSIGN(JavascriptPolicyHandler);
};
// Handles URLBlacklist policies.
class URLBlacklistPolicyHandler : public ConfigurationPolicyHandler {
public:
URLBlacklistPolicyHandler();
virtual ~URLBlacklistPolicyHandler();
// ConfigurationPolicyHandler methods:
virtual bool CheckPolicySettings(const PolicyMap& policies,
PolicyErrorMap* errors) OVERRIDE;
virtual void ApplyPolicySettings(const PolicyMap& policies,
PrefValueMap* prefs) OVERRIDE;
private:
DISALLOW_COPY_AND_ASSIGN(URLBlacklistPolicyHandler);
};
// Handles RestoreOnStartup policy.
class RestoreOnStartupPolicyHandler : public TypeCheckingPolicyHandler {
public:
RestoreOnStartupPolicyHandler();
virtual ~RestoreOnStartupPolicyHandler();
// ConfigurationPolicyHandler methods:
virtual bool CheckPolicySettings(const PolicyMap& policies,
PolicyErrorMap* errors) OVERRIDE;
virtual void ApplyPolicySettings(const PolicyMap& policies,
PrefValueMap* prefs) OVERRIDE;
private:
void ApplyPolicySettingsFromHomePage(const PolicyMap& policies,
PrefValueMap* prefs);
DISALLOW_COPY_AND_ASSIGN(RestoreOnStartupPolicyHandler);
};
} // namespace policy
#endif // CHROME_BROWSER_POLICY_CONFIGURATION_POLICY_HANDLER_H_