// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_ASH_SETTINGS_SESSION_MANAGER_OPERATION_H_
#define CHROME_BROWSER_ASH_SETTINGS_SESSION_MANAGER_OPERATION_H_
#include <memory>
#include <string>
#include "base/functional/callback.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/ref_counted.h"
#include "chrome/browser/ash/policy/core/device_cloud_policy_validator.h"
#include "chrome/browser/ash/settings/device_settings_service.h"
#include "chromeos/ash/components/dbus/session_manager/session_manager_client.h"
#include "net/cert/x509_util_nss.h"
namespace enterprise_management {
class ChromeDeviceSettingsProto;
class PolicyData;
class PolicyFetchResponse;
}
namespace ownership {
class OwnerKeyUtil;
class PublicKey;
}
namespace ash {
// Handles a single transaction with session manager. This is a virtual base
// class that contains common infrastructure for key and policy loading. There
// are subclasses for loading, storing and signing policy blobs.
class SessionManagerOperation {
public:
using Callback = base::OnceCallback<void(SessionManagerOperation*,
DeviceSettingsService::Status)>;
// Creates a new load operation.
explicit SessionManagerOperation(Callback callback);
SessionManagerOperation(const SessionManagerOperation&) = delete;
SessionManagerOperation& operator=(const SessionManagerOperation&) = delete;
virtual ~SessionManagerOperation();
// Starts the operation.
void Start(SessionManagerClient* session_manager_client,
scoped_refptr<ownership::OwnerKeyUtil> owner_key_util,
scoped_refptr<ownership::PublicKey> public_key);
// Restarts a load operation (if that part is already in progress).
void RestartLoad(bool key_changed);
// Accessors for recovering the loaded policy data after completion.
std::unique_ptr<enterprise_management::PolicyData>& policy_data() {
return policy_data_;
}
std::unique_ptr<enterprise_management::PolicyFetchResponse>&
policy_fetch_response() {
return policy_fetch_response_;
}
std::unique_ptr<enterprise_management::ChromeDeviceSettingsProto>&
device_settings() {
return device_settings_;
}
// Public part of the owner key as configured/loaded from disk.
scoped_refptr<ownership::PublicKey> public_key() { return public_key_; }
// Whether the load operation is underway.
bool is_loading() const { return is_loading_; }
protected:
// Runs the operation. The result is reported through |callback_|.
virtual void Run() = 0;
// Ensures the public key is loaded.
void EnsurePublicKey(base::OnceClosure callback);
// Starts a load operation.
void StartLoading();
// Synchronous load operation.
void LoadImmediately();
// Reports the result status of the operation. Once this gets called, the
// operation should not perform further processing or trigger callbacks.
void ReportResult(DeviceSettingsService::Status status);
SessionManagerClient* session_manager_client() {
return session_manager_client_;
}
bool force_key_load_ = false;
bool force_immediate_load_ = false;
std::unique_ptr<enterprise_management::PolicyFetchResponse>
policy_fetch_response_;
private:
// Loads the owner key from disk. Must be run on a thread that can do I/O.
static scoped_refptr<ownership::PublicKey> LoadPublicKey(
scoped_refptr<ownership::OwnerKeyUtil> util,
scoped_refptr<ownership::PublicKey> current_key);
// Stores the owner key loaded by LoadOwnerKey and calls |callback|.
void StorePublicKey(base::OnceClosure callback,
scoped_refptr<ownership::PublicKey> new_key);
// Triggers a device settings load.
void RetrieveDeviceSettings();
// Same as RetrieveDeviceSettings, but loads synchronously.
void BlockingRetrieveDeviceSettings();
// Validates device settings after retrieval from session_manager.
void ValidateDeviceSettings(
SessionManagerClient::RetrievePolicyResponseType response_type,
const std::string& policy_blob);
// Extracts status and device settings from the validator and reports them.
void ReportValidatorStatus(policy::DeviceCloudPolicyValidator* validator);
raw_ptr<SessionManagerClient> session_manager_client_ = nullptr;
scoped_refptr<ownership::OwnerKeyUtil> owner_key_util_;
Callback callback_;
scoped_refptr<ownership::PublicKey> public_key_;
bool is_loading_ = false;
std::unique_ptr<enterprise_management::PolicyData> policy_data_;
std::unique_ptr<enterprise_management::ChromeDeviceSettingsProto>
device_settings_;
base::WeakPtrFactory<SessionManagerOperation> weak_factory_{this};
};
// This operation loads the public owner key from disk if appropriate, fetches
// the policy blob from session manager, and validates the loaded policy blob.
class LoadSettingsOperation : public SessionManagerOperation {
public:
// Creates a new load operation. Signature validation and other
// cloud-specific checks are performed.
// If |force_immediate_load| is true, load happens synchronously on Run()
// call.
LoadSettingsOperation(bool force_key_load,
bool force_immediate_load,
Callback callback);
LoadSettingsOperation(const LoadSettingsOperation&) = delete;
LoadSettingsOperation& operator=(const LoadSettingsOperation&) = delete;
~LoadSettingsOperation() override;
protected:
// SessionManagerOperation:
void Run() override;
};
// Stores a pre-generated policy blob and reloads the device settings from
// session_manager.
class StoreSettingsOperation : public SessionManagerOperation {
public:
// Creates a new store operation.
StoreSettingsOperation(
Callback callback,
std::unique_ptr<enterprise_management::PolicyFetchResponse> policy);
StoreSettingsOperation(const StoreSettingsOperation&) = delete;
StoreSettingsOperation& operator=(const StoreSettingsOperation&) = delete;
~StoreSettingsOperation() override;
protected:
// SessionManagerOperation:
void Run() override;
private:
// Handles the result of the store operation and triggers the load.
void HandleStoreResult(bool success);
base::WeakPtrFactory<StoreSettingsOperation> weak_factory_{this};
};
} // namespace ash
#endif // CHROME_BROWSER_ASH_SETTINGS_SESSION_MANAGER_OPERATION_H_