Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2146)

Unified Diff: chrome/browser/policy/device_cloud_policy_store_chromeos.cc

Issue 10885015: Implement new-style CloudPolicyStore for Chrome OS device policy. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/policy/device_cloud_policy_store_chromeos.cc
diff --git a/chrome/browser/policy/device_cloud_policy_store_chromeos.cc b/chrome/browser/policy/device_cloud_policy_store_chromeos.cc
new file mode 100644
index 0000000000000000000000000000000000000000..a2f4c82059508ac8e0f0cbe24b1642dec5b13046
--- /dev/null
+++ b/chrome/browser/policy/device_cloud_policy_store_chromeos.cc
@@ -0,0 +1,164 @@
+// 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.
+
+#include "chrome/browser/policy/device_cloud_policy_store_chromeos.h"
+
+#include "base/bind.h"
+#include "chrome/browser/chromeos/settings/device_settings_service.h"
Joao da Silva 2012/08/28 19:56:57 Already in .h
Mattias Nissler (ping if slow) 2012/08/31 14:13:18 Done.
+#include "chrome/browser/policy/device_policy_decoder_chromeos.h"
+#include "chrome/browser/policy/enterprise_install_attributes.h"
+#include "chrome/browser/policy/proto/chrome_device_policy.pb.h"
+#include "chrome/browser/policy/proto/device_management_backend.pb.h"
+
+namespace em = enterprise_management;
+
+namespace policy {
+
+DeviceCloudPolicyStoreChromeOS::DeviceCloudPolicyStoreChromeOS(
+ chromeos::DeviceSettingsService* device_settings_service,
+ EnterpriseInstallAttributes* install_attributes)
+ : device_settings_service_(device_settings_service),
+ install_attributes_(install_attributes),
+ ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)) {
+ device_settings_service_->AddObserver(this);
+}
+
+DeviceCloudPolicyStoreChromeOS::~DeviceCloudPolicyStoreChromeOS() {
+ device_settings_service_->RemoveObserver(this);
+}
+
+void DeviceCloudPolicyStoreChromeOS::Store(
+ const em::PolicyFetchResponse& policy) {
+ // Cancel all pending requests.
+ weak_factory_.InvalidateWeakPtrs();
+
+ scoped_refptr<chromeos::OwnerKey> owner_key(
+ device_settings_service_->GetOwnerKey());
+ if (!install_attributes_->IsEnterpriseDevice() ||
+ !device_settings_service_->policy_data() ||
+ !owner_key || !owner_key->public_key()) {
+ status_ = STATUS_BAD_STATE;
+ NotifyStoreError();
+ return;
+ }
+
+ scoped_ptr<DeviceCloudPolicyValidator> validator(CreateValidator(policy));
+ validator->ValidateSignature(*owner_key->public_key(), true);
+ validator->ValidateAgainstCurrentPolicy(
+ device_settings_service_->policy_data(), false);
+ validator.release()->StartValidation();
Joao da Silva 2012/08/28 19:56:57 The scoped_ptr can be skipped for this block but I
Mattias Nissler (ping if slow) 2012/08/31 14:13:18 Returning the scoped_ptr from CreateValidator clea
+}
+
+void DeviceCloudPolicyStoreChromeOS::Load() {
+ device_settings_service_->Load();
+}
+
+void DeviceCloudPolicyStoreChromeOS::RemoveStoredPolicy() {
+ // Device policy cannot and should not be removed on Chrome OS.
+ NOTREACHED();
+}
+
+void DeviceCloudPolicyStoreChromeOS::InstallInitialPolicy(
+ const em::PolicyFetchResponse& policy) {
+ // Cancel all pending requests.
+ weak_factory_.InvalidateWeakPtrs();
+
+ if (!install_attributes_->IsEnterpriseDevice() &&
+ device_settings_service_->status() !=
+ chromeos::DeviceSettingsService::STORE_NO_POLICY) {
+ status_ = STATUS_BAD_STATE;
+ NotifyStoreError();
+ return;
+ }
+
+ scoped_ptr<DeviceCloudPolicyValidator> validator(CreateValidator(policy));
+ validator->ValidateInitialKey();
+ validator.release()->StartValidation();
Joao da Silva 2012/08/28 19:56:57 Same here
Mattias Nissler (ping if slow) 2012/08/31 14:13:18 Same reply
+}
+
+void DeviceCloudPolicyStoreChromeOS::OwnershipStatusChanged() {
+ // Nothing to do.
+}
+
+void DeviceCloudPolicyStoreChromeOS::DeviceSettingsUpdated() {
+ if (!weak_factory_.HasWeakPtrs())
+ UpdateFromService();
+}
+
+scoped_ptr<DeviceCloudPolicyValidator>
+ DeviceCloudPolicyStoreChromeOS::CreateValidator(
+ const em::PolicyFetchResponse& policy) {
+ scoped_ptr<DeviceCloudPolicyValidator> validator(
+ DeviceCloudPolicyValidator::Create(
+ scoped_ptr<em::PolicyFetchResponse>(
+ new em::PolicyFetchResponse(policy)),
+ base::Bind(&DeviceCloudPolicyStoreChromeOS::OnPolicyToStoreValidated,
+ weak_factory_.GetWeakPtr())));
+ validator->ValidateDomain(install_attributes_->GetDomain());
+ validator->ValidatePolicyType(dm_protocol::kChromeDevicePolicyType);
+ validator->ValidatePayload();
+ return validator.Pass();
+}
+
+void DeviceCloudPolicyStoreChromeOS::OnPolicyToStoreValidated(
+ DeviceCloudPolicyValidator* validator) {
+ if (!validator->success()) {
+ status_ = STATUS_VALIDATION_ERROR;
+ validation_status_ = validator->status();
+ NotifyStoreError();
+ return;
+ }
+
+ device_settings_service_->Store(
+ validator->policy().Pass(),
+ base::Bind(&DeviceCloudPolicyStoreChromeOS::OnPolicyStored,
+ weak_factory_.GetWeakPtr()));
+}
+
+void DeviceCloudPolicyStoreChromeOS::OnPolicyStored() {
+ UpdateFromService();
+}
+
+void DeviceCloudPolicyStoreChromeOS::UpdateFromService() {
+ if (!install_attributes_->IsEnterpriseDevice()) {
+ status_ = STATUS_BAD_STATE;
+ NotifyStoreError();
+ return;
+ }
+
+ switch (device_settings_service_->status()) {
+ case chromeos::DeviceSettingsService::STORE_SUCCESS: {
+ status_ = STATUS_OK;
+ policy_.reset(new em::PolicyData());
+ if (device_settings_service_->policy_data())
+ policy_->MergeFrom(*device_settings_service_->policy_data());
+
+ PolicyMap new_policy_map;
+ if (is_managed()) {
+ DecodeDevicePolicy(*device_settings_service_->device_settings(),
+ &new_policy_map, install_attributes_);
+ }
+ policy_map_.Swap(&new_policy_map);
+
+ NotifyStoreLoaded();
+ return;
+ }
+ case chromeos::DeviceSettingsService::STORE_KEY_UNAVAILABLE:
+ status_ = STATUS_BAD_STATE;
+ break;
+ case chromeos::DeviceSettingsService::STORE_POLICY_ERROR:
+ case chromeos::DeviceSettingsService::STORE_OPERATION_FAILED:
+ status_ = STATUS_STORE_ERROR;
+ break;
+ case chromeos::DeviceSettingsService::STORE_NO_POLICY:
+ case chromeos::DeviceSettingsService::STORE_INVALID_POLICY:
+ case chromeos::DeviceSettingsService::STORE_VALIDATION_ERROR:
+ status_ = STATUS_LOAD_ERROR;
+ break;
+ }
+
+ NotifyStoreError();
+}
+
+} // namespace policy

Powered by Google App Engine
This is Rietveld 408576698