// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CHROME_BROWSER_CHROMEOS_OWNERSHIP_OWNER_SETTINGS_SERVICE_H_ #define CHROME_BROWSER_CHROMEOS_OWNERSHIP_OWNER_SETTINGS_SERVICE_H_ #include #include "base/compiler_specific.h" #include "base/macros.h" #include "base/memory/weak_ptr.h" #include "base/threading/thread_checker.h" #include "chrome/browser/chromeos/settings/device_settings_service.h" #include "chrome/browser/chromeos/settings/owner_key_util.h" #include "chromeos/dbus/session_manager_client.h" #include "chromeos/tpm_token_loader.h" #include "components/keyed_service/core/keyed_service.h" #include "content/public/browser/notification_observer.h" #include "content/public/browser/notification_registrar.h" class Profile; namespace chromeos { // This class reloads owner key from profile NSS slots. // // TODO (ygorshenin@): move write path for device settings here // (crbug.com/230018). class OwnerSettingsService : public DeviceSettingsService::PrivateKeyDelegate, public KeyedService, public content::NotificationObserver, public TPMTokenLoader::Observer, public SessionManagerClient::Observer { public: virtual ~OwnerSettingsService(); base::WeakPtr as_weak_ptr() { return weak_factory_.GetWeakPtr(); } // DeviceSettingsService::PrivateKeyDelegate implementation: virtual bool IsOwner() OVERRIDE; virtual void IsOwnerAsync(const IsOwnerCallback& callback) OVERRIDE; virtual bool AssembleAndSignPolicyAsync( scoped_ptr policy, const AssembleAndSignPolicyCallback& callback) OVERRIDE; // NotificationObserver implementation: virtual void Observe(int type, const content::NotificationSource& source, const content::NotificationDetails& details) OVERRIDE; // TPMTokenLoader::Observer: virtual void OnTPMTokenReady() OVERRIDE; // SessionManagerClient::Observer: virtual void OwnerKeySet(bool success) OVERRIDE; // Checks whether NSS slots with private key are mounted or // not. Responds via |callback|. static void IsPrivateKeyExistAsync(const IsOwnerCallback& callback); static void SetOwnerKeyUtilForTesting( const scoped_refptr& owner_key_util); static void SetDeviceSettingsServiceForTesting( DeviceSettingsService* device_settings_service); private: friend class OwnerSettingsServiceFactory; explicit OwnerSettingsService(Profile* profile); // Reloads private key from profile's NSS slots. Responds via call // to OnPrivateKeyLoaded(). void ReloadPrivateKey(); // Called when ReloadPrivateKey() completes it's work. void OnPrivateKeyLoaded(scoped_ptr private_key); // Returns testing instance of OwnerKeyUtil when it's set, otherwise // returns |owner_key_util_|. scoped_refptr GetOwnerKeyUtil(); // Returns testing instance of DeviceSettingsService when it's set, // otherwise returns pointer to a singleton instance, when it's // initialized. DeviceSettingsService* GetDeviceSettingsService(); // Profile this service instance belongs to. Profile* profile_; scoped_refptr private_key_; scoped_refptr owner_key_util_; std::vector pending_is_owner_callbacks_; // Whether profile still needs to be initialized. bool waiting_for_profile_creation_; // Whether TPM token still needs to be initialized. bool waiting_for_tpm_token_; content::NotificationRegistrar registrar_; base::ThreadChecker thread_checker_; base::WeakPtrFactory weak_factory_; DISALLOW_COPY_AND_ASSIGN(OwnerSettingsService); }; } // namespace chromeos #endif // CHROME_BROWSER_CHROMEOS_OWNERSHIP_OWNER_SETTINGS_SERVICE_H_