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"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/policy/cloud/cloud_policy_validator.h"
19558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "chromeos/cert_loader.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/session_manager_client.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace crypto {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RSAPrivateKey;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace enterprise_management {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ChromeDeviceSettingsProto;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PolicyData;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PolicyFetchResponse;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class OwnerKeyUtil;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SessionManagerOperation;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Keeps the public and private halves of the owner key. Both may be missing,
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// but if the private key is present, the public half will be as well. This
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// class is immutable and refcounted in order to allow safe access from any
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// thread.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class OwnerKey : public base::RefCountedThreadSafe<OwnerKey> {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OwnerKey(scoped_ptr<std::vector<uint8> > public_key,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           scoped_ptr<crypto::RSAPrivateKey> private_key);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::vector<uint8>* public_key() {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return public_key_.get();
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  crypto::RSAPrivateKey* private_key() {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return private_key_.get();
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class base::RefCountedThreadSafe<OwnerKey>;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~OwnerKey();
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<std::vector<uint8> > public_key_;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<crypto::RSAPrivateKey> private_key_;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(OwnerKey);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Deals with the low-level interface to Chromium OS device settings. Device
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// settings are stored in a protobuf that's protected by a cryptographic
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// signature generated by a key in the device owner's possession. Key and
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// settings are brokered by the session_manager daemon.
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The purpose of DeviceSettingsService is to keep track of the current key and
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// settings blob. For reading and writing device settings, use CrosSettings
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// instead, which provides a high-level interface that allows for manipulation
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// of individual settings.
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DeviceSettingsService generates notifications for key and policy update
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// events so interested parties can reload state as appropriate.
75558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochclass DeviceSettingsService : public SessionManagerClient::Observer,
76558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                              public CertLoader::Observer {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Indicates ownership status of the device.
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum OwnershipStatus {
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Listed in upgrade order.
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OWNERSHIP_UNKNOWN = 0,
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OWNERSHIP_NONE,
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OWNERSHIP_TAKEN
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef base::Callback<void(OwnershipStatus, bool)> OwnershipStatusCallback;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Status codes for Store().
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum Status {
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STORE_SUCCESS,
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STORE_KEY_UNAVAILABLE,       // Owner key not yet configured.
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STORE_POLICY_ERROR,          // Failure constructing the settings blob.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STORE_OPERATION_FAILED,      // IPC to session_manager daemon failed.
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STORE_NO_POLICY,             // No settings blob present.
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STORE_INVALID_POLICY,        // Invalid settings blob.
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STORE_VALIDATION_ERROR,      // Unrecoverable policy validation failure.
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STORE_TEMP_VALIDATION_ERROR, // Temporary policy validation failure.
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Observer interface.
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class Observer {
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ~Observer();
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Indicates device ownership status changes.
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void OwnershipStatusChanged() = 0;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Gets call after updates to the device settings.
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void DeviceSettingsUpdated() = 0;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Manage singleton instance.
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static void Initialize();
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static bool IsInitialized();
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static void Shutdown();
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static DeviceSettingsService* Get();
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates a device settings service instance. This is meant for unit tests,
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // production code uses the singleton returned by Get() above.
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeviceSettingsService();
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~DeviceSettingsService();
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // To be called on startup once threads are initialized and DBus is ready.
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void SetSessionManager(SessionManagerClient* session_manager_client,
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         scoped_refptr<OwnerKeyUtil> owner_key_util);
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Prevents the service from making further calls to session_manager_client
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and stops any pending operations.
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void UnsetSessionManager();
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the currently active device settings. Returns NULL if the device
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // settings have not been retrieved from session_manager yet.
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const enterprise_management::PolicyData* policy_data() {
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return policy_data_.get();
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const enterprise_management::ChromeDeviceSettingsProto*
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      device_settings() const {
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return device_settings_.get();
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the currently used owner key.
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<OwnerKey> GetOwnerKey();
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the status generated by the last operation.
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Status status() {
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return store_status_;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Triggers an attempt to pull the public half of the owner key from disk and
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // load the device settings.
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Load();
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Signs |settings| with the private half of the owner key and sends the
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // resulting policy blob to session manager for storage. The result of the
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // operation is reported through |callback|. If successful, the updated device
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // settings are present in policy_data() and device_settings() when the
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // callback runs.
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SignAndStore(
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_ptr<enterprise_management::ChromeDeviceSettingsProto> new_settings,
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const base::Closure& callback);
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Stores a policy blob to session_manager. The result of the operation is
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // reported through |callback|. If successful, the updated device settings are
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // present in policy_data() and device_settings() when the callback runs.
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Store(scoped_ptr<enterprise_management::PolicyFetchResponse> policy,
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             const base::Closure& callback);
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the ownership status. May return OWNERSHIP_UNKNOWN if the disk
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // hasn't been checked yet.
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OwnershipStatus GetOwnershipStatus();
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Determines the ownership status and reports the result to |callback|. This
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is guaranteed to never return OWNERSHIP_UNKNOWN.
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetOwnershipStatusAsync(const OwnershipStatusCallback& callback);
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Checks whether we have the private owner key.
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool HasPrivateOwnerKey();
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets the identity of the user that's interacting with the service. This is
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // relevant only for writing settings through SignAndStore().
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetUsername(const std::string& username);
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& GetUsername() const;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds an observer.
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddObserver(Observer* observer);
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Removes an observer.
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RemoveObserver(Observer* observer);
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SessionManagerClient::Observer:
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OwnerKeySet(bool success) OVERRIDE;
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void PropertyChangeComplete(bool success) OVERRIDE;
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
193558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // CertLoader::Observer:
194558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  virtual void OnCertificatesLoaded(const net::CertificateList& cert_list,
195558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                                    bool initial_load) OVERRIDE;
196558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Enqueues a new operation. Takes ownership of |operation| and starts it
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // right away if there is no active operation currently.
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Enqueue(SessionManagerOperation* operation);
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Enqueues a load operation.
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void EnqueueLoad(bool force_key_load);
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Makes sure there's a reload operation so changes to the settings (and key,
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in case force_key_load is set) are getting picked up.
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void EnsureReload(bool force_key_load);
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Runs the next pending operation.
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StartNextOperation();
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Updates status, policy data and owner key from a finished operation.
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Starts the next pending operation if available.
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void HandleCompletedOperation(const base::Closure& callback,
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                SessionManagerOperation* operation,
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                Status status);
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionManagerClient* session_manager_client_;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<OwnerKeyUtil> owner_key_util_;
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WeakPtrFactory<DeviceSettingsService> weak_factory_;
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_;
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<OwnerKey> owner_key_;
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<enterprise_management::PolicyData> policy_data_;
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<enterprise_management::ChromeDeviceSettingsProto> device_settings_;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The queue of pending operations. The first operation on the queue is
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // currently active; it gets removed and destroyed once it completes.
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::deque<SessionManagerOperation*> pending_operations_;
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ObserverList<Observer, true> observers_;
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For recoverable load errors how many retries are left before we give up.
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int load_retries_left_;
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DeviceSettingsService);
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Helper class for tests. Initializes the DeviceSettingsService singleton on
246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// construction and tears it down again on destruction.
247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class ScopedTestDeviceSettingsService {
248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ScopedTestDeviceSettingsService();
250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ~ScopedTestDeviceSettingsService();
251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ScopedTestDeviceSettingsService);
254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chromeos
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_CHROMEOS_SETTINGS_DEVICE_SETTINGS_SERVICE_H_
259