device_settings_service.h revision 1320f92c476a1ad9d19dba2a48c72b75566198e9
16a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek// Copyright (c) 2012 The Chromium Authors. All rights reserved.
26a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek// Use of this source code is governed by a BSD-style license that can be
36a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek// found in the LICENSE file.
46a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek
56a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek#ifndef CHROME_BROWSER_CHROMEOS_SETTINGS_DEVICE_SETTINGS_SERVICE_H_
66a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek#define CHROME_BROWSER_CHROMEOS_SETTINGS_DEVICE_SETTINGS_SERVICE_H_
76a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek
86a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek#include <deque>
96a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek#include <string>
106a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek#include <vector>
116a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek
126a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek#include "base/basictypes.h"
136a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek#include "base/callback.h"
146a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek#include "base/compiler_specific.h"
15339b9c27759d7b6a53e2370f83f66e78b3254595Ted Kremenek#include "base/memory/ref_counted.h"
166a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek#include "base/memory/scoped_ptr.h"
176a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek#include "base/observer_list.h"
18867924dbeca06870573fd58d620032da6994b223Chris Lattner#include "chrome/browser/chromeos/policy/proto/chrome_device_policy.pb.h"
193245a0a1c7a4fd74fca845b2edba275bb126d773Chris Lattner#include "chromeos/dbus/session_manager_client.h"
206a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek#include "components/ownership/owner_settings_service.h"
2157df3b950061c73d13d3116f747e79d7955a216aChris Lattner#include "components/policy/core/common/cloud/cloud_policy_validator.h"
22339b9c27759d7b6a53e2370f83f66e78b3254595Ted Kremenek#include "crypto/scoped_nss_types.h"
236a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek#include "policy/proto/device_management_backend.pb.h"
24a95d3750441ac8ad03e36af8e6e74039c9a3109dTed Kremenek
256a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremeneknamespace crypto {
266a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenekclass RSAPrivateKey;
279402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner}
285ef3e2c45f13fccdb0d7bbcf24c1beee8eee6f64Chris Lattner
295ef3e2c45f13fccdb0d7bbcf24c1beee8eee6f64Chris Lattnernamespace ownership {
305ef3e2c45f13fccdb0d7bbcf24c1beee8eee6f64Chris Lattnerclass OwnerKeyUtil;
315ef3e2c45f13fccdb0d7bbcf24c1beee8eee6f64Chris Lattnerclass PublicKey;
325ef3e2c45f13fccdb0d7bbcf24c1beee8eee6f64Chris Lattner}
335ef3e2c45f13fccdb0d7bbcf24c1beee8eee6f64Chris Lattner
345ef3e2c45f13fccdb0d7bbcf24c1beee8eee6f64Chris Lattnernamespace chromeos {
35f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattner
36f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattnerclass SessionManagerOperation;
37a11d61793341fea195c29a0dab3fbd74f2b39a8cChris Lattner
38a11d61793341fea195c29a0dab3fbd74f2b39a8cChris Lattner// Deals with the low-level interface to Chromium OS device settings. Device
395ef3e2c45f13fccdb0d7bbcf24c1beee8eee6f64Chris Lattner// settings are stored in a protobuf that's protected by a cryptographic
4052c29081281955d3db9e11d10573b2d38f709099Chris Lattner// signature generated by a key in the device owner's possession. Key and
4152c29081281955d3db9e11d10573b2d38f709099Chris Lattner// settings are brokered by the session_manager daemon.
421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump//
435ef3e2c45f13fccdb0d7bbcf24c1beee8eee6f64Chris Lattner// The purpose of DeviceSettingsService is to keep track of the current key and
442c78b873f4f3823ae859c15674cb3d76c8554113Chris Lattner// settings blob. For reading and writing device settings, use CrosSettings
451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump// instead, which provides a high-level interface that allows for manipulation
462b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner// of individual settings.
472b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner//
485ef3e2c45f13fccdb0d7bbcf24c1beee8eee6f64Chris Lattner// DeviceSettingsService generates notifications for key and policy update
495ef3e2c45f13fccdb0d7bbcf24c1beee8eee6f64Chris Lattner// events so interested parties can reload state as appropriate.
505ef3e2c45f13fccdb0d7bbcf24c1beee8eee6f64Chris Lattnerclass DeviceSettingsService : public SessionManagerClient::Observer {
515ef3e2c45f13fccdb0d7bbcf24c1beee8eee6f64Chris Lattner public:
525ef3e2c45f13fccdb0d7bbcf24c1beee8eee6f64Chris Lattner  // Indicates ownership status of the device.
535ef3e2c45f13fccdb0d7bbcf24c1beee8eee6f64Chris Lattner  enum OwnershipStatus {
545ef3e2c45f13fccdb0d7bbcf24c1beee8eee6f64Chris Lattner    // Listed in upgrade order.
559402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner    OWNERSHIP_UNKNOWN = 0,
56d7407dc92c7d19cafce429e7e1cf9819d3fc0b92Daniel Dunbar    OWNERSHIP_NONE,
57d7407dc92c7d19cafce429e7e1cf9819d3fc0b92Daniel Dunbar    OWNERSHIP_TAKEN
581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  };
599402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner
609402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner  typedef base::Callback<void(OwnershipStatus)> OwnershipStatusCallback;
619402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner
621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // Status codes for Store().
639402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner  enum Status {
649402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner    STORE_SUCCESS,
659402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner    STORE_KEY_UNAVAILABLE,       // Owner key not yet configured.
669402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner    STORE_POLICY_ERROR,          // Failure constructing the settings blob.
679402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner    STORE_OPERATION_FAILED,      // IPC to session_manager daemon failed.
689402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner    STORE_NO_POLICY,             // No settings blob present.
699402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner    STORE_INVALID_POLICY,        // Invalid settings blob.
709402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner    STORE_VALIDATION_ERROR,      // Unrecoverable policy validation failure.
71d7407dc92c7d19cafce429e7e1cf9819d3fc0b92Daniel Dunbar    STORE_TEMP_VALIDATION_ERROR, // Temporary policy validation failure.
721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  };
739402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner
749402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner  // Observer interface.
759402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner  class Observer {
769402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner   public:
779402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner    virtual ~Observer();
789402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner
799402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner    // Indicates device ownership status changes.
809402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner    virtual void OwnershipStatusChanged() = 0;
819402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner
829402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner    // Gets call after updates to the device settings.
839402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner    virtual void DeviceSettingsUpdated() = 0;
849402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner  };
859402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner
861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // Manage singleton instance.
879402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner  static void Initialize();
889402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner  static bool IsInitialized();
899402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner  static void Shutdown();
90d7407dc92c7d19cafce429e7e1cf9819d3fc0b92Daniel Dunbar  static DeviceSettingsService* Get();
919402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner
929402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner  // Creates a device settings service instance. This is meant for unit tests,
931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // production code uses the singleton returned by Get() above.
949402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner  DeviceSettingsService();
959402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner  virtual ~DeviceSettingsService();
969402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner
979402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner  // To be called on startup once threads are initialized and DBus is ready.
989402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner  void SetSessionManager(SessionManagerClient* session_manager_client,
995ef3e2c45f13fccdb0d7bbcf24c1beee8eee6f64Chris Lattner                         scoped_refptr<ownership::OwnerKeyUtil> owner_key_util);
1005ef3e2c45f13fccdb0d7bbcf24c1beee8eee6f64Chris Lattner
1012b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner  // Prevents the service from making further calls to session_manager_client
102fa5be3617294f0e3c341f0ecb6b2076478b1b5acTed Kremenek  // and stops any pending operations.
1031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  void UnsetSessionManager();
1042b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner
1056a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek  SessionManagerClient* session_manager_client() const {
1066a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek    return session_manager_client_;
1071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
1086a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek
1091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // Returns the currently active device settings. Returns NULL if the device
1102b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner  // settings have not been retrieved from session_manager yet.
1115c176f7a9ba9f7084b903393845be24f85e091daChris Lattner  const enterprise_management::PolicyData* policy_data() {
1125c176f7a9ba9f7084b903393845be24f85e091daChris Lattner    return policy_data_.get();
1136a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek  }
1146a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek  const enterprise_management::ChromeDeviceSettingsProto*
1155c176f7a9ba9f7084b903393845be24f85e091daChris Lattner      device_settings() const {
1165c176f7a9ba9f7084b903393845be24f85e091daChris Lattner    return device_settings_.get();
1175c176f7a9ba9f7084b903393845be24f85e091daChris Lattner  }
1185c176f7a9ba9f7084b903393845be24f85e091daChris Lattner
1195c176f7a9ba9f7084b903393845be24f85e091daChris Lattner  // Returns the currently used owner key.
1201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  scoped_refptr<ownership::PublicKey> GetPublicKey();
121735271479ac57c27f744806859efd5b001dea248Chris Lattner
122735271479ac57c27f744806859efd5b001dea248Chris Lattner  // Returns the status generated by the last operation.
123d7407dc92c7d19cafce429e7e1cf9819d3fc0b92Daniel Dunbar  Status status() {
1245c176f7a9ba9f7084b903393845be24f85e091daChris Lattner    return store_status_;
125735271479ac57c27f744806859efd5b001dea248Chris Lattner  }
126f3d8d19caf6f1a21785eee8d62c45ef5a0a0e72eChris Lattner
127d7407dc92c7d19cafce429e7e1cf9819d3fc0b92Daniel Dunbar  // Triggers an attempt to pull the public half of the owner key from disk and
128f3d8d19caf6f1a21785eee8d62c45ef5a0a0e72eChris Lattner  // load the device settings.
129f3d8d19caf6f1a21785eee8d62c45ef5a0a0e72eChris Lattner  void Load();
1301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1315c176f7a9ba9f7084b903393845be24f85e091daChris Lattner  // Signs |settings| with the private half of the owner key and sends the
132735271479ac57c27f744806859efd5b001dea248Chris Lattner  // resulting policy blob to session manager for storage. The result of the
13349cd6354d5373245dd2e69ca7b7113e6a795d36eTed Kremenek  // operation is reported through |callback|. If successful, the updated device
1345c176f7a9ba9f7084b903393845be24f85e091daChris Lattner  // settings are present in policy_data() and device_settings() when the
135735271479ac57c27f744806859efd5b001dea248Chris Lattner  // callback runs.
136d7407dc92c7d19cafce429e7e1cf9819d3fc0b92Daniel Dunbar  void SignAndStore(
137d7407dc92c7d19cafce429e7e1cf9819d3fc0b92Daniel Dunbar      scoped_ptr<enterprise_management::ChromeDeviceSettingsProto> new_settings,
138d7407dc92c7d19cafce429e7e1cf9819d3fc0b92Daniel Dunbar      const base::Closure& callback);
139735271479ac57c27f744806859efd5b001dea248Chris Lattner
140d7407dc92c7d19cafce429e7e1cf9819d3fc0b92Daniel Dunbar  // Sets the management related settings in PolicyData.
1415c176f7a9ba9f7084b903393845be24f85e091daChris Lattner  void SetManagementSettings(
142735271479ac57c27f744806859efd5b001dea248Chris Lattner      enterprise_management::PolicyData::ManagementMode management_mode,
1435c176f7a9ba9f7084b903393845be24f85e091daChris Lattner      const std::string& request_token,
144735271479ac57c27f744806859efd5b001dea248Chris Lattner      const std::string& device_id,
145d7407dc92c7d19cafce429e7e1cf9819d3fc0b92Daniel Dunbar      const base::Closure& callback);
1465c176f7a9ba9f7084b903393845be24f85e091daChris Lattner
147735271479ac57c27f744806859efd5b001dea248Chris Lattner  // Stores a policy blob to session_manager. The result of the operation is
1481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // reported through |callback|. If successful, the updated device settings are
149735271479ac57c27f744806859efd5b001dea248Chris Lattner  // present in policy_data() and device_settings() when the callback runs.
150d7407dc92c7d19cafce429e7e1cf9819d3fc0b92Daniel Dunbar  void Store(scoped_ptr<enterprise_management::PolicyFetchResponse> policy,
1515c176f7a9ba9f7084b903393845be24f85e091daChris Lattner             const base::Closure& callback);
152735271479ac57c27f744806859efd5b001dea248Chris Lattner
1531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // Returns the ownership status. May return OWNERSHIP_UNKNOWN if the disk
154735271479ac57c27f744806859efd5b001dea248Chris Lattner  // hasn't been checked yet.
155d7407dc92c7d19cafce429e7e1cf9819d3fc0b92Daniel Dunbar  OwnershipStatus GetOwnershipStatus();
1565c176f7a9ba9f7084b903393845be24f85e091daChris Lattner
157735271479ac57c27f744806859efd5b001dea248Chris Lattner  // Determines the ownership status and reports the result to |callback|. This
1586a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek  // is guaranteed to never return OWNERSHIP_UNKNOWN.
1596a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek  void GetOwnershipStatusAsync(const OwnershipStatusCallback& callback);
1606a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek
1616a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek  // Checks whether we have the private owner key.
162fa5be3617294f0e3c341f0ecb6b2076478b1b5acTed Kremenek  bool HasPrivateOwnerKey();
163fa5be3617294f0e3c341f0ecb6b2076478b1b5acTed Kremenek
1641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // Sets the identity of the user that's interacting with the service. This is
165053ef593fa9d2b890645a914eee203231fb34458Ted Kremenek  // relevant only for writing settings through SignAndStore().
166a95d3750441ac8ad03e36af8e6e74039c9a3109dTed Kremenek  void InitOwner(const std::string& username,
167a95d3750441ac8ad03e36af8e6e74039c9a3109dTed Kremenek                 const base::WeakPtr<ownership::OwnerSettingsService>&
1681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                     owner_settings_service);
169053ef593fa9d2b890645a914eee203231fb34458Ted Kremenek
1701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  const std::string& GetUsername() const;
171053ef593fa9d2b890645a914eee203231fb34458Ted Kremenek
172053ef593fa9d2b890645a914eee203231fb34458Ted Kremenek  // Adds an observer.
1738570f0b0fde7ca812f8d37f52305f3df4dd2ce01Chris Lattner  void AddObserver(Observer* observer);
1748570f0b0fde7ca812f8d37f52305f3df4dd2ce01Chris Lattner  // Removes an observer.
1751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  void RemoveObserver(Observer* observer);
1768570f0b0fde7ca812f8d37f52305f3df4dd2ce01Chris Lattner
1778570f0b0fde7ca812f8d37f52305f3df4dd2ce01Chris Lattner  // SessionManagerClient::Observer:
1788570f0b0fde7ca812f8d37f52305f3df4dd2ce01Chris Lattner  virtual void OwnerKeySet(bool success) OVERRIDE;
1798570f0b0fde7ca812f8d37f52305f3df4dd2ce01Chris Lattner  virtual void PropertyChangeComplete(bool success) OVERRIDE;
1801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
181c01b46e2f115bed83f2f6f4a55809bf4003ee015Zhongxing Xu private:
182c01b46e2f115bed83f2f6f4a55809bf4003ee015Zhongxing Xu  friend class OwnerSettingsServiceChromeOS;
183c01b46e2f115bed83f2f6f4a55809bf4003ee015Zhongxing Xu
184c01b46e2f115bed83f2f6f4a55809bf4003ee015Zhongxing Xu  // Enqueues a new operation. Takes ownership of |operation| and starts it
185c01b46e2f115bed83f2f6f4a55809bf4003ee015Zhongxing Xu  // right away if there is no active operation currently.
186c01b46e2f115bed83f2f6f4a55809bf4003ee015Zhongxing Xu  void Enqueue(SessionManagerOperation* operation);
187c01b46e2f115bed83f2f6f4a55809bf4003ee015Zhongxing Xu
188c01b46e2f115bed83f2f6f4a55809bf4003ee015Zhongxing Xu  // Enqueues a load operation.
189c01b46e2f115bed83f2f6f4a55809bf4003ee015Zhongxing Xu  void EnqueueLoad(bool force_key_load);
1901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
191c01b46e2f115bed83f2f6f4a55809bf4003ee015Zhongxing Xu  // Makes sure there's a reload operation so changes to the settings (and key,
1921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // in case force_key_load is set) are getting picked up.
193c01b46e2f115bed83f2f6f4a55809bf4003ee015Zhongxing Xu  void EnsureReload(bool force_key_load);
1941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
195c01b46e2f115bed83f2f6f4a55809bf4003ee015Zhongxing Xu  // Runs the next pending operation.
196c01b46e2f115bed83f2f6f4a55809bf4003ee015Zhongxing Xu  void StartNextOperation();
197c01b46e2f115bed83f2f6f4a55809bf4003ee015Zhongxing Xu
198053ef593fa9d2b890645a914eee203231fb34458Ted Kremenek  // Updates status, policy data and owner key from a finished operation.
199053ef593fa9d2b890645a914eee203231fb34458Ted Kremenek  // Starts the next pending operation if available.
2001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  void HandleCompletedOperation(const base::Closure& callback,
201053ef593fa9d2b890645a914eee203231fb34458Ted Kremenek                                SessionManagerOperation* operation,
202053ef593fa9d2b890645a914eee203231fb34458Ted Kremenek                                Status status);
203053ef593fa9d2b890645a914eee203231fb34458Ted Kremenek
2048570f0b0fde7ca812f8d37f52305f3df4dd2ce01Chris Lattner  // Updates status and invokes the callback immediately.
2058570f0b0fde7ca812f8d37f52305f3df4dd2ce01Chris Lattner  void HandleError(Status status, const base::Closure& callback);
2067e37c818f9f77608c602ffb32c1135e3cd0132a8Daniel Dunbar
2077e37c818f9f77608c602ffb32c1135e3cd0132a8Daniel Dunbar  // Called by OwnerSettingsService when sign-and-store operation completes.
2087e37c818f9f77608c602ffb32c1135e3cd0132a8Daniel Dunbar  void OnSignAndStoreOperationCompleted(Status status);
2097e37c818f9f77608c602ffb32c1135e3cd0132a8Daniel Dunbar
2107e37c818f9f77608c602ffb32c1135e3cd0132a8Daniel Dunbar  void set_policy_data(
2117e37c818f9f77608c602ffb32c1135e3cd0132a8Daniel Dunbar      scoped_ptr<enterprise_management::PolicyData> policy_data) {
2121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    policy_data_ = policy_data.Pass();
21349cd6354d5373245dd2e69ca7b7113e6a795d36eTed Kremenek  }
2147e37c818f9f77608c602ffb32c1135e3cd0132a8Daniel Dunbar
215d7407dc92c7d19cafce429e7e1cf9819d3fc0b92Daniel Dunbar  void set_device_settings(scoped_ptr<
21657df3b950061c73d13d3116f747e79d7955a216aChris Lattner      enterprise_management::ChromeDeviceSettingsProto> device_settings) {
217d7407dc92c7d19cafce429e7e1cf9819d3fc0b92Daniel Dunbar    device_settings_ = device_settings.Pass();
218d7407dc92c7d19cafce429e7e1cf9819d3fc0b92Daniel Dunbar  }
21949cd6354d5373245dd2e69ca7b7113e6a795d36eTed Kremenek
220b485cd1e0a5a1e942d0e682b9b1c4bc9df111528Ted Kremenek  SessionManagerClient* session_manager_client_;
221b485cd1e0a5a1e942d0e682b9b1c4bc9df111528Ted Kremenek  scoped_refptr<ownership::OwnerKeyUtil> owner_key_util_;
2222b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner
223b485cd1e0a5a1e942d0e682b9b1c4bc9df111528Ted Kremenek  Status store_status_;
2242b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner
225b485cd1e0a5a1e942d0e682b9b1c4bc9df111528Ted Kremenek  std::vector<OwnershipStatusCallback> pending_ownership_status_callbacks_;
226b485cd1e0a5a1e942d0e682b9b1c4bc9df111528Ted Kremenek
227b485cd1e0a5a1e942d0e682b9b1c4bc9df111528Ted Kremenek  std::string username_;
2282b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner  scoped_refptr<ownership::PublicKey> public_key_;
2291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  base::WeakPtr<ownership::OwnerSettingsService> owner_settings_service_;
230b485cd1e0a5a1e942d0e682b9b1c4bc9df111528Ted Kremenek
2311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  scoped_ptr<enterprise_management::PolicyData> policy_data_;
232b485cd1e0a5a1e942d0e682b9b1c4bc9df111528Ted Kremenek  scoped_ptr<enterprise_management::ChromeDeviceSettingsProto> device_settings_;
233b485cd1e0a5a1e942d0e682b9b1c4bc9df111528Ted Kremenek
2341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // The queue of pending operations. The first operation on the queue is
2351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // currently active; it gets removed and destroyed once it completes.
2361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  std::deque<SessionManagerOperation*> pending_operations_;
237b485cd1e0a5a1e942d0e682b9b1c4bc9df111528Ted Kremenek
238b485cd1e0a5a1e942d0e682b9b1c4bc9df111528Ted Kremenek  ObserverList<Observer, true> observers_;
239b485cd1e0a5a1e942d0e682b9b1c4bc9df111528Ted Kremenek
2401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // For recoverable load errors how many retries are left before we give up.
241b485cd1e0a5a1e942d0e682b9b1c4bc9df111528Ted Kremenek  int load_retries_left_;
242b485cd1e0a5a1e942d0e682b9b1c4bc9df111528Ted Kremenek
2431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  base::WeakPtrFactory<DeviceSettingsService> weak_factory_;
244b485cd1e0a5a1e942d0e682b9b1c4bc9df111528Ted Kremenek
2451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  DISALLOW_COPY_AND_ASSIGN(DeviceSettingsService);
24649cd6354d5373245dd2e69ca7b7113e6a795d36eTed Kremenek};
24749cd6354d5373245dd2e69ca7b7113e6a795d36eTed Kremenek
24849cd6354d5373245dd2e69ca7b7113e6a795d36eTed Kremenek// Helper class for tests. Initializes the DeviceSettingsService singleton on
2491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump// construction and tears it down again on destruction.
25049cd6354d5373245dd2e69ca7b7113e6a795d36eTed Kremenekclass ScopedTestDeviceSettingsService {
25149cd6354d5373245dd2e69ca7b7113e6a795d36eTed Kremenek public:
252b485cd1e0a5a1e942d0e682b9b1c4bc9df111528Ted Kremenek  ScopedTestDeviceSettingsService();
253b485cd1e0a5a1e942d0e682b9b1c4bc9df111528Ted Kremenek  ~ScopedTestDeviceSettingsService();
2541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
25549cd6354d5373245dd2e69ca7b7113e6a795d36eTed Kremenek private:
25649cd6354d5373245dd2e69ca7b7113e6a795d36eTed Kremenek  DISALLOW_COPY_AND_ASSIGN(ScopedTestDeviceSettingsService);
2571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump};
2588570f0b0fde7ca812f8d37f52305f3df4dd2ce01Chris Lattner
259d6c1360c2bf234c73572a865f119d0518aca8154Ted Kremenek}  // namespace chromeos
2601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2618570f0b0fde7ca812f8d37f52305f3df4dd2ce01Chris Lattner#endif  // CHROME_BROWSER_CHROMEOS_SETTINGS_DEVICE_SETTINGS_SERVICE_H_
262d7407dc92c7d19cafce429e7e1cf9819d3fc0b92Daniel Dunbar