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