1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193
|
// 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_
|