summaryrefslogtreecommitdiffstats
path: root/chrome/browser/policy/configuration_policy_provider_mac.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/policy/configuration_policy_provider_mac.cc')
-rw-r--r--chrome/browser/policy/configuration_policy_provider_mac.cc82
1 files changed, 61 insertions, 21 deletions
diff --git a/chrome/browser/policy/configuration_policy_provider_mac.cc b/chrome/browser/policy/configuration_policy_provider_mac.cc
index 552e33c..62b7436 100644
--- a/chrome/browser/policy/configuration_policy_provider_mac.cc
+++ b/chrome/browser/policy/configuration_policy_provider_mac.cc
@@ -4,28 +4,50 @@
#include "chrome/browser/policy/configuration_policy_provider_mac.h"
+#include "base/file_util.h"
#include "base/logging.h"
#include "base/mac/scoped_cftyperef.h"
+#include "base/path_service.h"
#include "base/sys_string_conversions.h"
+#include "chrome/common/chrome_paths.h"
namespace policy {
-ConfigurationPolicyProviderMac::ConfigurationPolicyProviderMac(
- const StaticPolicyValueMap& policy_map)
- : ConfigurationPolicyProvider(policy_map),
- preferences_(new MacPreferences()) {
+static FilePath GetManagedPolicyPath() {
+ // This constructs the path to the plist file in which Mac OS X stores the
+ // managed preference for the application. This is undocumented and therefore
+ // fragile, but if it doesn't work out, FileBasedPolicyLoader has a task that
+ // polls periodically in order to reload managed preferences later even if we
+ // missed the change.
+ FilePath path;
+ if (!PathService::Get(chrome::DIR_MANAGED_PREFS, &path))
+ return FilePath();
+
+ CFBundleRef bundle(CFBundleGetMainBundle());
+ if (!bundle)
+ return FilePath();
+
+ CFStringRef bundle_id = CFBundleGetIdentifier(bundle);
+ if (!bundle_id)
+ return FilePath();
+
+ return path.Append(base::SysCFStringRefToUTF8(bundle_id) + ".plist");
}
-ConfigurationPolicyProviderMac::ConfigurationPolicyProviderMac(
- const StaticPolicyValueMap& policy_map, MacPreferences* preferences)
- : ConfigurationPolicyProvider(policy_map), preferences_(preferences) {
+MacPreferencesPolicyLoader::MacPreferencesPolicyLoader(
+ MacPreferences* preferences,
+ const ConfigurationPolicyProvider::PolicyDefinitionList* policy_list)
+ : FileBasedPolicyProvider::Delegate(GetManagedPolicyPath()),
+ policy_list_(policy_list),
+ preferences_(preferences) {
}
-bool ConfigurationPolicyProviderMac::Provide(ConfigurationPolicyStore* store) {
- const PolicyValueMap& mapping = policy_value_map();
+DictionaryValue* MacPreferencesPolicyLoader::Load() {
+ preferences_->AppSynchronize(kCFPreferencesCurrentApplication);
+ DictionaryValue* policy = new DictionaryValue;
- for (PolicyValueMap::const_iterator current = mapping.begin();
- current != mapping.end(); ++current) {
+ const ConfigurationPolicyProvider::PolicyDefinitionList::Entry* current;
+ for (current = policy_list_->begin; current != policy_list_->end; ++current) {
base::mac::ScopedCFTypeRef<CFStringRef> name(
base::SysUTF8ToCFStringRef(current->name));
base::mac::ScopedCFTypeRef<CFPropertyListRef> value(
@@ -40,16 +62,13 @@ bool ConfigurationPolicyProviderMac::Provide(ConfigurationPolicyStore* store) {
if (CFGetTypeID(value) == CFStringGetTypeID()) {
std::string string_value =
base::SysCFStringRefToUTF8((CFStringRef)value.get());
- store->Apply(
- current->policy_type,
- Value::CreateStringValue(string_value));
+ policy->SetString(current->name, string_value);
}
break;
case Value::TYPE_BOOLEAN:
if (CFGetTypeID(value) == CFBooleanGetTypeID()) {
bool bool_value = CFBooleanGetValue((CFBooleanRef)value.get());
- store->Apply(current->policy_type,
- Value::CreateBooleanValue(bool_value));
+ policy->SetBoolean(current->name, bool_value);
}
break;
case Value::TYPE_INTEGER:
@@ -59,8 +78,7 @@ bool ConfigurationPolicyProviderMac::Provide(ConfigurationPolicyStore* store) {
kCFNumberIntType,
&int_value);
if (cast)
- store->Apply(current->policy_type,
- Value::CreateIntegerValue(int_value));
+ policy->SetInteger(current->name, int_value);
}
break;
case Value::TYPE_LIST:
@@ -81,16 +99,38 @@ bool ConfigurationPolicyProviderMac::Provide(ConfigurationPolicyStore* store) {
}
}
if (valid_array)
- store->Apply(current->policy_type, list_value.release());
+ policy->Set(current->name, list_value.release());
}
break;
default:
NOTREACHED();
- return false;
}
}
- return true;
+ return policy;
+}
+
+base::Time MacPreferencesPolicyLoader::GetLastModification() {
+ base::PlatformFileInfo file_info;
+ if (!file_util::GetFileInfo(config_file_path(), &file_info) ||
+ file_info.is_directory) {
+ return base::Time();
+ }
+
+ return file_info.last_modified;
+}
+
+ConfigurationPolicyProviderMac::ConfigurationPolicyProviderMac(
+ const ConfigurationPolicyProvider::PolicyDefinitionList* policy_list)
+ : FileBasedPolicyProvider(policy_list,
+ new MacPreferencesPolicyLoader(new MacPreferences, policy_list)) {
+}
+
+ConfigurationPolicyProviderMac::ConfigurationPolicyProviderMac(
+ const ConfigurationPolicyProvider::PolicyDefinitionList* policy_list,
+ MacPreferences* preferences)
+ : FileBasedPolicyProvider(policy_list,
+ new MacPreferencesPolicyLoader(preferences, policy_list)) {
}
} // namespace policy