Index: components/policy/core/common/policy_loader_mac.mm |
diff --git a/components/policy/core/common/policy_loader_mac.cc b/components/policy/core/common/policy_loader_mac.mm |
similarity index 63% |
rename from components/policy/core/common/policy_loader_mac.cc |
rename to components/policy/core/common/policy_loader_mac.mm |
index 04e6314887de0c770a925f585ae71b6f8a9a14b2..e10735b7a3bf94e65378ebcbda5f03cd8407be8c 100644 |
--- a/components/policy/core/common/policy_loader_mac.cc |
+++ b/components/policy/core/common/policy_loader_mac.mm |
@@ -1,4 +1,4 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
+// Copyright (c) 2015 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. |
@@ -7,6 +7,7 @@ |
#include "base/bind.h" |
#include "base/bind_helpers.h" |
#include "base/callback.h" |
+#include "base/files/file_path.h" |
#include "base/files/file_util.h" |
#include "base/mac/foundation_util.h" |
#include "base/mac/scoped_cftyperef.h" |
@@ -32,9 +33,23 @@ PolicyLoaderMac::PolicyLoaderMac( |
MacPreferences* preferences) |
: AsyncPolicyLoader(task_runner), |
preferences_(preferences), |
- managed_policy_path_(managed_policy_path) {} |
+ managed_policy_path_(managed_policy_path), |
+ application_id_(kCFPreferencesCurrentApplication) { |
+} |
+ |
+PolicyLoaderMac::PolicyLoaderMac( |
+ scoped_refptr<base::SequencedTaskRunner> task_runner, |
+ const base::FilePath& managed_policy_path, |
+ MacPreferences* preferences, |
+ CFStringRef application_id) |
+ : AsyncPolicyLoader(task_runner), |
+ preferences_(preferences), |
+ managed_policy_path_(managed_policy_path), |
+ application_id_(application_id) { |
+} |
-PolicyLoaderMac::~PolicyLoaderMac() {} |
+PolicyLoaderMac::~PolicyLoaderMac() { |
+} |
void PolicyLoaderMac::InitOnBackgroundThread() { |
if (!managed_policy_path_.empty()) { |
@@ -45,7 +60,7 @@ void PolicyLoaderMac::InitOnBackgroundThread() { |
} |
scoped_ptr<PolicyBundle> PolicyLoaderMac::Load() { |
- preferences_->AppSynchronize(kCFPreferencesCurrentApplication); |
+ preferences_->AppSynchronize(application_id_); |
scoped_ptr<PolicyBundle> bundle(new PolicyBundle()); |
// Load Chrome's policy. |
@@ -56,24 +71,23 @@ scoped_ptr<PolicyBundle> PolicyLoaderMac::Load() { |
bool policy_present = false; |
const Schema* schema = |
schema_map()->GetSchema(PolicyNamespace(POLICY_DOMAIN_CHROME, "")); |
- for (Schema::Iterator it = schema->GetPropertiesIterator(); |
- !it.IsAtEnd(); it.Advance()) { |
+ for (Schema::Iterator it = schema->GetPropertiesIterator(); !it.IsAtEnd(); |
+ it.Advance()) { |
base::ScopedCFTypeRef<CFStringRef> name( |
base::SysUTF8ToCFStringRef(it.key())); |
base::ScopedCFTypeRef<CFPropertyListRef> value( |
- preferences_->CopyAppValue(name, kCFPreferencesCurrentApplication)); |
+ preferences_->CopyAppValue(name, application_id_)); |
if (!value.get()) |
continue; |
policy_present = true; |
- bool forced = |
- preferences_->AppValueIsForced(name, kCFPreferencesCurrentApplication); |
- PolicyLevel level = forced ? POLICY_LEVEL_MANDATORY : |
- POLICY_LEVEL_RECOMMENDED; |
+ bool forced = preferences_->AppValueIsForced(name, application_id_); |
+ PolicyLevel level = |
+ forced ? POLICY_LEVEL_MANDATORY : POLICY_LEVEL_RECOMMENDED; |
// TODO(joaodasilva): figure the policy scope. |
scoped_ptr<base::Value> policy = PropertyToValue(value); |
if (policy) { |
- chrome_policy.Set( |
- it.key(), level, POLICY_SCOPE_USER, policy.release(), NULL); |
+ chrome_policy.Set(it.key(), level, POLICY_SCOPE_USER, policy.release(), |
+ NULL); |
} else { |
status.Add(POLICY_LOAD_STATUS_PARSE_ERROR); |
} |
@@ -98,10 +112,31 @@ base::Time PolicyLoaderMac::LastModificationTime() { |
return file_info.last_modified; |
} |
-void PolicyLoaderMac::LoadPolicyForDomain( |
- PolicyDomain domain, |
- const std::string& domain_name, |
- PolicyBundle* bundle) { |
+#if defined(OS_MACOSX) && !defined(OS_IOS) |
+ |
+base::FilePath PolicyLoaderMac::GetManagedPolicyPath(CFStringRef bundle_id) { |
+ // 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, AsyncPolicyLoader has a task that |
+ // polls periodically in order to reload managed preferences later even if we |
+ // missed the change. |
+ |
+ base::FilePath path; |
+ if (!base::mac::GetLocalDirectory(NSLibraryDirectory, &path)) |
+ return base::FilePath(); |
+ path = path.Append(FILE_PATH_LITERAL("Managed Preferences")); |
+ char* login = getlogin(); |
+ if (!login) |
+ return base::FilePath(); |
+ path = path.AppendASCII(login); |
+ return path.Append(base::SysCFStringRefToUTF8(bundle_id) + ".plist"); |
+} |
+ |
+#endif |
+ |
+void PolicyLoaderMac::LoadPolicyForDomain(PolicyDomain domain, |
+ const std::string& domain_name, |
+ PolicyBundle* bundle) { |
std::string id_prefix(base::mac::BaseBundleID()); |
id_prefix.append(".").append(domain_name).append("."); |
@@ -132,22 +167,21 @@ void PolicyLoaderMac::LoadPolicyForComponent( |
base::SysUTF8ToCFStringRef(bundle_id_string)); |
preferences_->AppSynchronize(bundle_id); |
- for (Schema::Iterator it = schema.GetPropertiesIterator(); |
- !it.IsAtEnd(); it.Advance()) { |
+ for (Schema::Iterator it = schema.GetPropertiesIterator(); !it.IsAtEnd(); |
+ it.Advance()) { |
base::ScopedCFTypeRef<CFStringRef> pref_name( |
base::SysUTF8ToCFStringRef(it.key())); |
base::ScopedCFTypeRef<CFPropertyListRef> value( |
preferences_->CopyAppValue(pref_name, bundle_id)); |
if (!value.get()) |
continue; |
- bool forced = |
- preferences_->AppValueIsForced(pref_name, bundle_id); |
- PolicyLevel level = forced ? POLICY_LEVEL_MANDATORY : |
- POLICY_LEVEL_RECOMMENDED; |
+ bool forced = preferences_->AppValueIsForced(pref_name, bundle_id); |
+ PolicyLevel level = |
+ forced ? POLICY_LEVEL_MANDATORY : POLICY_LEVEL_RECOMMENDED; |
scoped_ptr<base::Value> policy_value = PropertyToValue(value); |
if (policy_value) { |
- policy->Set(it.key(), level, POLICY_SCOPE_USER, |
- policy_value.release(), NULL); |
+ policy->Set(it.key(), level, POLICY_SCOPE_USER, policy_value.release(), |
+ NULL); |
} |
} |
} |