Index: chrome/browser/chromeos/policy/device_local_account_extension_tracker.cc |
diff --git a/chrome/browser/chromeos/policy/device_local_account_extension_tracker.cc b/chrome/browser/chromeos/policy/device_local_account_extension_tracker.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..cc8cd124a6045137ac9055a64ea6549a58668c96 |
--- /dev/null |
+++ b/chrome/browser/chromeos/policy/device_local_account_extension_tracker.cc |
@@ -0,0 +1,83 @@ |
+// Copyright (c) 2014 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. |
+ |
+#include "chrome/browser/chromeos/policy/device_local_account_extension_tracker.h" |
+ |
+#include "base/logging.h" |
+#include "base/prefs/pref_value_map.h" |
+#include "base/values.h" |
+#include "chrome/browser/chromeos/policy/device_local_account.h" |
+#include "chrome/browser/extensions/policy_handlers.h" |
+#include "components/policy/core/common/policy_map.h" |
+#include "components/policy/core/common/policy_namespace.h" |
+#include "components/policy/core/common/schema.h" |
+#include "components/policy/core/common/schema_registry.h" |
+#include "extensions/browser/pref_names.h" |
+ |
+namespace policy { |
+ |
+DeviceLocalAccountExtensionTracker::DeviceLocalAccountExtensionTracker( |
+ const DeviceLocalAccount& account, |
+ CloudPolicyStore* store, |
+ SchemaRegistry* schema_registry) |
+ : store_(store), |
+ schema_registry_(schema_registry) { |
+ if (account.type == DeviceLocalAccount::TYPE_KIOSK_APP) { |
+ // This is easy: Just add a component for the app id. |
+ PolicyNamespace ns(POLICY_DOMAIN_EXTENSIONS, account.kiosk_app_id); |
+ schema_registry_->RegisterComponent(ns, Schema()); |
+ } else if (account.type == DeviceLocalAccount::TYPE_PUBLIC_SESSION) { |
+ // For public sessions, track the value of the ExtensionInstallForcelist |
+ // policy. |
+ store_->AddObserver(this); |
+ UpdateFromStore(); |
+ } else { |
+ NOTREACHED(); |
+ } |
+ |
+ schema_registry_->SetReady(POLICY_DOMAIN_EXTENSIONS); |
+} |
+ |
+DeviceLocalAccountExtensionTracker::~DeviceLocalAccountExtensionTracker() { |
+ store_->RemoveObserver(this); |
+} |
+ |
+void DeviceLocalAccountExtensionTracker::OnStoreLoaded( |
+ CloudPolicyStore* store) { |
+ UpdateFromStore(); |
+} |
+ |
+void DeviceLocalAccountExtensionTracker::OnStoreError(CloudPolicyStore* store) { |
+ UpdateFromStore(); |
+} |
+ |
+void DeviceLocalAccountExtensionTracker::UpdateFromStore() { |
+ const policy::PolicyMap& policy_map = store_->policy_map(); |
+ |
+ extensions::ExtensionInstallForcelistPolicyHandler policy_handler; |
+ if (!policy_handler.CheckPolicySettings(policy_map, NULL)) |
+ return; |
+ |
+ PrefValueMap pref_value_map; |
+ policy_handler.ApplyPolicySettings(policy_map, &pref_value_map); |
+ |
+ const base::Value* value = NULL; |
+ const base::DictionaryValue* dict = NULL; |
+ if (!pref_value_map.GetValue(extensions::pref_names::kInstallForceList, |
+ &value) || |
+ !value->GetAsDictionary(&dict)) { |
+ return; |
+ } |
+ |
+ for (base::DictionaryValue::Iterator it(*dict); !it.IsAtEnd(); it.Advance()) { |
+ PolicyNamespace ns(POLICY_DOMAIN_EXTENSIONS, it.key()); |
+ schema_registry_->RegisterComponent(ns, Schema()); |
+ } |
+ |
+ // Removing an extension from a public session at runtime can happen but is |
+ // a rare event. In that case we leave the extension ID in the SchemaRegistry, |
+ // and it will be purged on the next restart. |
+} |
+ |
+} // namespace policy |