// 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_CHROMEOS_H_ #define CHROME_BROWSER_CHROMEOS_OWNERSHIP_OWNER_SETTINGS_SERVICE_CHROMEOS_H_ #include #include #include "base/callback_forward.h" #include "base/containers/scoped_ptr_hash_map.h" #include "base/macros.h" #include "base/values.h" #include "chrome/browser/chromeos/policy/proto/chrome_device_policy.pb.h" #include "chrome/browser/chromeos/settings/device_settings_service.h" #include "chromeos/dbus/session_manager_client.h" #include "components/keyed_service/core/keyed_service.h" #include "components/ownership/owner_key_util.h" #include "components/ownership/owner_settings_service.h" #include "components/policy/core/common/cloud/cloud_policy_constants.h" #include "content/public/browser/notification_observer.h" #include "content/public/browser/notification_registrar.h" class Profile; namespace content { class WebUI; } namespace ownership { class OwnerKeyUtil; } namespace chromeos { class FakeOwnerSettingsService; // The class is a profile-keyed service which holds public/private // keypair corresponds to a profile. The keypair is reloaded automatically when // profile is created and TPM token is ready. Note that the private part of a // key can be loaded only for the owner. // // TODO (ygorshenin@): move write path for device settings here // (crbug.com/230018). class OwnerSettingsServiceChromeOS : public ownership::OwnerSettingsService, public content::NotificationObserver, public SessionManagerClient::Observer, public DeviceSettingsService::Observer { public: typedef base::Callback OnManagementSettingsSetCallback; struct ManagementSettings { ManagementSettings(); ~ManagementSettings(); policy::ManagementMode management_mode; std::string request_token; std::string device_id; }; ~OwnerSettingsServiceChromeOS() override; static OwnerSettingsServiceChromeOS* FromWebUI(content::WebUI* web_ui); void OnTPMTokenReady(bool tpm_token_enabled); bool HasPendingChanges() const; // ownership::OwnerSettingsService implementation: bool HandlesSetting(const std::string& setting) override; bool Set(const std::string& setting, const base::Value& value) override; bool AppendToList(const std::string& setting, const base::Value& value) override; bool RemoveFromList(const std::string& setting, const base::Value& value) override; bool CommitTentativeDeviceSettings( scoped_ptr policy) override; // NotificationObserver implementation: void Observe(int type, const content::NotificationSource& source, const content::NotificationDetails& details) override; // SessionManagerClient::Observer: void OwnerKeySet(bool success) override; // DeviceSettingsService::Observer: void OwnershipStatusChanged() override; void DeviceSettingsUpdated() override; void OnDeviceSettingsServiceShutdown() override; // Sets the management related settings. virtual void SetManagementSettings( const ManagementSettings& settings, const OnManagementSettingsSetCallback& callback); // Checks if the user is the device owner, without the user profile having to // been initialized. Should be used only if login state is in safe mode. static void IsOwnerForSafeModeAsync( const std::string& user_hash, const scoped_refptr& owner_key_util, const IsOwnerCallback& callback); // Assembles PolicyData based on |settings|, |policy_data|, |user_id| and // |pending_management_settings|. Applies local-owner policy fixups if needed. static scoped_ptr AssemblePolicy( const std::string& user_id, const enterprise_management::PolicyData* policy_data, bool apply_pending_mangement_settings, const ManagementSettings& pending_management_settings, enterprise_management::ChromeDeviceSettingsProto* settings); // Updates device |settings|. static void UpdateDeviceSettings( const std::string& path, const base::Value& value, enterprise_management::ChromeDeviceSettingsProto& settings); protected: OwnerSettingsServiceChromeOS( DeviceSettingsService* device_settings_service, Profile* profile, const scoped_refptr& owner_key_util); private: friend class OwnerSettingsServiceChromeOSFactory; // Perform fixups required to ensure sensical local-owner device policy: // 1) user whitelisting must be explicitly allowed or disallowed, and // 2) the owner user must be on the whitelist, if it's enforced. static void FixupLocalOwnerPolicy( const std::string& user_id, enterprise_management::ChromeDeviceSettingsProto* settings); // OwnerSettingsService protected interface overrides: // Reloads private key from profile's NSS slots, responds via |callback|. On // success, |private_key| is non-null, but if the private key doesn't exist, // |private_key->key()| may be null. void ReloadKeypairImpl(const base::Callback< void(const scoped_refptr& public_key, const scoped_refptr& private_key)>& callback) override; // Possibly notifies DeviceSettingsService that owner's keypair is loaded. void OnPostKeypairLoadedActions() override; // Tries to apply recent changes to device settings proto, sign it and store. void StorePendingChanges(); // Called when current device settings are successfully signed. // Sends signed settings for storage. void OnPolicyAssembledAndSigned( scoped_ptr policy_response); // Called by DeviceSettingsService when modified and signed device // settings are stored. void OnSignedPolicyStored(bool success); // Report status to observers and tries to continue storing pending chages to // device settings. void ReportStatusAndContinueStoring(bool success); DeviceSettingsService* device_settings_service_; // Profile this service instance belongs to. Profile* profile_; // User ID this service instance belongs to. std::string user_id_; // 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_; // True if local-owner policy fixups are still pending. bool has_pending_fixups_; // A set of pending changes to device settings. base::ScopedPtrHashMap> pending_changes_; // True if there're pending changes to management settings. bool has_pending_management_settings_; // A set of pending changes to management settings. ManagementSettings pending_management_settings_; // A set of callbacks that need to be run after management settings // are set and policy is stored. std::vector pending_management_settings_callbacks_; // A protobuf containing pending changes to device settings. scoped_ptr tentative_settings_; content::NotificationRegistrar registrar_; base::WeakPtrFactory weak_factory_; base::WeakPtrFactory store_settings_factory_; DISALLOW_COPY_AND_ASSIGN(OwnerSettingsServiceChromeOS); }; } // namespace chromeos #endif // CHROME_BROWSER_CHROMEOS_OWNERSHIP_OWNER_SETTINGS_SERVICE_CHROMEOS_H_