1b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov// Use of this source code is governed by a BSD-style license that can be
3b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// found in the LICENSE file.
4b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#ifndef CHROME_BROWSER_CHROMEOS_POLICY_DEVICE_CLOUD_POLICY_STORE_CHROMEOS_H_
6eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov#define CHROME_BROWSER_CHROMEOS_POLICY_DEVICE_CLOUD_POLICY_STORE_CHROMEOS_H_
7436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include "base/basictypes.h"
9b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "base/compiler_specific.h"
10b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "base/memory/ref_counted.h"
11b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "base/memory/scoped_ptr.h"
12b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "base/memory/weak_ptr.h"
13436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include "chrome/browser/chromeos/policy/device_cloud_policy_validator.h"
14b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "chrome/browser/chromeos/settings/device_settings_service.h"
15b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "components/policy/core/common/cloud/cloud_policy_store.h"
16b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
17b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovnamespace base {
18b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovclass SequencedTaskRunner;
19b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
20b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
21b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovnamespace enterprise_management {
22b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovclass PolicyFetchResponse;
23b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
24b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
25b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovnamespace policy {
26b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
27436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovclass EnterpriseInstallAttributes;
28436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
29436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov// CloudPolicyStore implementation for device policy on Chrome OS. Policy is
30b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// stored/loaded via DBus to/from session_manager.
31436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovclass DeviceCloudPolicyStoreChromeOS
32b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    : public CloudPolicyStore,
33436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      public chromeos::DeviceSettingsService::Observer {
34436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov public:
35b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  DeviceCloudPolicyStoreChromeOS(
36b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      chromeos::DeviceSettingsService* device_settings_service,
37436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      EnterpriseInstallAttributes* install_attributes,
38436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      scoped_refptr<base::SequencedTaskRunner> background_task_runner);
39436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  virtual ~DeviceCloudPolicyStoreChromeOS();
40436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
41436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  // CloudPolicyStore:
42436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  virtual void Store(
43436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      const enterprise_management::PolicyFetchResponse& policy) OVERRIDE;
44436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  virtual void Load() OVERRIDE;
45b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
46b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  // Installs initial policy. This is different from Store() in that it skips
47436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  // the signature validation step against already-installed policy. The checks
48b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  // against installation-time attributes are performed nevertheless. The result
49b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  // of the operation is reported through the OnStoreLoaded() or OnStoreError()
50b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  // observer callbacks.
51eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov  void InstallInitialPolicy(
52436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      const enterprise_management::PolicyFetchResponse& policy);
53436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
54b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  // chromeos::DeviceSettingsService::Observer:
55b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  virtual void OwnershipStatusChanged() OVERRIDE;
56b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  virtual void DeviceSettingsUpdated() OVERRIDE;
57b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
58436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov private:
59b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  // Create a validator for |policy| with basic device policy configuration and
60b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  // OnPolicyStored() as the completion callback.
61436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  scoped_ptr<DeviceCloudPolicyValidator> CreateValidator(
62b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      const enterprise_management::PolicyFetchResponse& policy);
63436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
64436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  // Called on completion on the policy validation prior to storing policy.
65436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  // Starts the actual store operation.
66b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  void OnPolicyToStoreValidated(DeviceCloudPolicyValidator* validator);
67436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
68b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  // Handles store completion operations updates status.
69eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov  void OnPolicyStored();
70eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
71b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  // Re-syncs policy and status from |device_settings_service_|.
72b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  void UpdateFromService();
73b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
74b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  chromeos::DeviceSettingsService* device_settings_service_;
75b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  EnterpriseInstallAttributes* install_attributes_;
76b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
77b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  scoped_refptr<base::SequencedTaskRunner> background_task_runner_;
78b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
79b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  // Whether enterprise enrollment validation has yet been done.
80b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  bool enrollment_validation_done_;
81b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
82b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  base::WeakPtrFactory<DeviceCloudPolicyStoreChromeOS> weak_factory_;
83b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
84b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  DISALLOW_COPY_AND_ASSIGN(DeviceCloudPolicyStoreChromeOS);
85b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov};
86436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
87436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}  // namespace policy
88436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
89b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#endif  // CHROME_BROWSER_CHROMEOS_POLICY_DEVICE_CLOUD_POLICY_STORE_CHROMEOS_H_
90436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov