15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_CHROMEOS_SETTINGS_DEVICE_SETTINGS_SERVICE_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_CHROMEOS_SETTINGS_DEVICE_SETTINGS_SERVICE_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <deque>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h"
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/compiler_specific.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/observer_list.h"
185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/chromeos/policy/proto/chrome_device_policy.pb.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/session_manager_client.h"
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/ownership/owner_settings_service.h"
21a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/cloud/cloud_policy_validator.h"
22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "crypto/scoped_nss_types.h"
230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "policy/proto/device_management_backend.pb.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace crypto {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RSAPrivateKey;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace ownership {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class OwnerKeyUtil;
31f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class PublicKey;
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace chromeos {
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SessionManagerOperation;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Deals with the low-level interface to Chromium OS device settings. Device
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// settings are stored in a protobuf that's protected by a cryptographic
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// signature generated by a key in the device owner's possession. Key and
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// settings are brokered by the session_manager daemon.
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The purpose of DeviceSettingsService is to keep track of the current key and
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// settings blob. For reading and writing device settings, use CrosSettings
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// instead, which provides a high-level interface that allows for manipulation
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// of individual settings.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DeviceSettingsService generates notifications for key and policy update
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// events so interested parties can reload state as appropriate.
50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class DeviceSettingsService : public SessionManagerClient::Observer {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Indicates ownership status of the device.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum OwnershipStatus {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Listed in upgrade order.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OWNERSHIP_UNKNOWN = 0,
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OWNERSHIP_NONE,
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OWNERSHIP_TAKEN
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  typedef base::Callback<void(OwnershipStatus)> OwnershipStatusCallback;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Status codes for Store().
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum Status {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STORE_SUCCESS,
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STORE_KEY_UNAVAILABLE,       // Owner key not yet configured.
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STORE_POLICY_ERROR,          // Failure constructing the settings blob.
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STORE_OPERATION_FAILED,      // IPC to session_manager daemon failed.
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STORE_NO_POLICY,             // No settings blob present.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STORE_INVALID_POLICY,        // Invalid settings blob.
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STORE_VALIDATION_ERROR,      // Unrecoverable policy validation failure.
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STORE_TEMP_VALIDATION_ERROR, // Temporary policy validation failure.
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Observer interface.
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class Observer {
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ~Observer();
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Indicates device ownership status changes.
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void OwnershipStatusChanged() = 0;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Gets call after updates to the device settings.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void DeviceSettingsUpdated() = 0;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Manage singleton instance.
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static void Initialize();
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static bool IsInitialized();
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static void Shutdown();
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static DeviceSettingsService* Get();
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates a device settings service instance. This is meant for unit tests,
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // production code uses the singleton returned by Get() above.
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeviceSettingsService();
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~DeviceSettingsService();
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // To be called on startup once threads are initialized and DBus is ready.
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void SetSessionManager(SessionManagerClient* session_manager_client,
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                         scoped_refptr<ownership::OwnerKeyUtil> owner_key_util);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Prevents the service from making further calls to session_manager_client
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and stops any pending operations.
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void UnsetSessionManager();
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  SessionManagerClient* session_manager_client() const {
1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return session_manager_client_;
1075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the currently active device settings. Returns NULL if the device
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // settings have not been retrieved from session_manager yet.
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const enterprise_management::PolicyData* policy_data() {
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return policy_data_.get();
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const enterprise_management::ChromeDeviceSettingsProto*
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      device_settings() const {
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return device_settings_.get();
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the currently used owner key.
1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_refptr<ownership::PublicKey> GetPublicKey();
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the status generated by the last operation.
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Status status() {
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return store_status_;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Triggers an attempt to pull the public half of the owner key from disk and
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // load the device settings.
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Load();
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Signs |settings| with the private half of the owner key and sends the
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // resulting policy blob to session manager for storage. The result of the
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // operation is reported through |callback|. If successful, the updated device
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // settings are present in policy_data() and device_settings() when the
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // callback runs.
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SignAndStore(
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_ptr<enterprise_management::ChromeDeviceSettingsProto> new_settings,
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const base::Closure& callback);
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Sets the management related settings in PolicyData.
1410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void SetManagementSettings(
1420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      enterprise_management::PolicyData::ManagementMode management_mode,
1430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      const std::string& request_token,
1440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      const std::string& device_id,
1450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      const base::Closure& callback);
1460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Stores a policy blob to session_manager. The result of the operation is
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // reported through |callback|. If successful, the updated device settings are
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // present in policy_data() and device_settings() when the callback runs.
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Store(scoped_ptr<enterprise_management::PolicyFetchResponse> policy,
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             const base::Closure& callback);
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the ownership status. May return OWNERSHIP_UNKNOWN if the disk
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // hasn't been checked yet.
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OwnershipStatus GetOwnershipStatus();
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Determines the ownership status and reports the result to |callback|. This
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is guaranteed to never return OWNERSHIP_UNKNOWN.
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetOwnershipStatusAsync(const OwnershipStatusCallback& callback);
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Checks whether we have the private owner key.
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool HasPrivateOwnerKey();
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets the identity of the user that's interacting with the service. This is
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // relevant only for writing settings through SignAndStore().
166f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void InitOwner(const std::string& username,
1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 const base::WeakPtr<ownership::OwnerSettingsService>&
1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                     owner_settings_service);
1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& GetUsername() const;
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds an observer.
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddObserver(Observer* observer);
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Removes an observer.
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RemoveObserver(Observer* observer);
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SessionManagerClient::Observer:
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OwnerKeySet(bool success) OVERRIDE;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void PropertyChangeComplete(bool success) OVERRIDE;
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  friend class OwnerSettingsServiceChromeOS;
1835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Enqueues a new operation. Takes ownership of |operation| and starts it
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // right away if there is no active operation currently.
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Enqueue(SessionManagerOperation* operation);
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Enqueues a load operation.
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void EnqueueLoad(bool force_key_load);
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Makes sure there's a reload operation so changes to the settings (and key,
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in case force_key_load is set) are getting picked up.
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void EnsureReload(bool force_key_load);
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Runs the next pending operation.
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StartNextOperation();
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Updates status, policy data and owner key from a finished operation.
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Starts the next pending operation if available.
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void HandleCompletedOperation(const base::Closure& callback,
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                SessionManagerOperation* operation,
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                Status status);
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Updates status and invokes the callback immediately.
2055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  void HandleError(Status status, const base::Closure& callback);
2065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Called by OwnerSettingsService when sign-and-store operation completes.
2085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void OnSignAndStoreOperationCompleted(Status status);
2095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void set_policy_data(
2115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      scoped_ptr<enterprise_management::PolicyData> policy_data) {
2125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    policy_data_ = policy_data.Pass();
2135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
2145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void set_device_settings(scoped_ptr<
2165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      enterprise_management::ChromeDeviceSettingsProto> device_settings) {
2175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    device_settings_ = device_settings.Pass();
2185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
2190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionManagerClient* session_manager_client_;
2211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_refptr<ownership::OwnerKeyUtil> owner_key_util_;
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Status store_status_;
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<OwnershipStatusCallback> pending_ownership_status_callbacks_;
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string username_;
2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_refptr<ownership::PublicKey> public_key_;
2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::WeakPtr<ownership::OwnerSettingsService> owner_settings_service_;
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<enterprise_management::PolicyData> policy_data_;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<enterprise_management::ChromeDeviceSettingsProto> device_settings_;
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The queue of pending operations. The first operation on the queue is
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // currently active; it gets removed and destroyed once it completes.
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::deque<SessionManagerOperation*> pending_operations_;
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ObserverList<Observer, true> observers_;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For recoverable load errors how many retries are left before we give up.
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int load_retries_left_;
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::WeakPtrFactory<DeviceSettingsService> weak_factory_;
2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DeviceSettingsService);
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Helper class for tests. Initializes the DeviceSettingsService singleton on
249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// construction and tears it down again on destruction.
250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class ScopedTestDeviceSettingsService {
251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ScopedTestDeviceSettingsService();
253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ~ScopedTestDeviceSettingsService();
254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ScopedTestDeviceSettingsService);
257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chromeos
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_CHROMEOS_SETTINGS_DEVICE_SETTINGS_SERVICE_H_
262