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
|
// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ash/cert_provisioning/cert_provisioning_worker.h"
#include <stdint.h>
#include <vector>
#include "base/no_destructor.h"
#include "chrome/browser/ash/cert_provisioning/cert_provisioning_client.h"
#include "chrome/browser/ash/cert_provisioning/cert_provisioning_common.h"
#include "chrome/browser/ash/cert_provisioning/cert_provisioning_invalidator.h"
#include "chrome/browser/ash/cert_provisioning/cert_provisioning_metrics.h"
#include "chrome/browser/ash/cert_provisioning/cert_provisioning_serializer.h"
#include "chrome/browser/ash/cert_provisioning/cert_provisioning_worker_static.h"
#include "chrome/browser/profiles/profile.h"
namespace em = enterprise_management;
namespace ash {
namespace cert_provisioning {
// ============= CertProvisioningWorkerFactory =================================
CertProvisioningWorkerFactory* CertProvisioningWorkerFactory::test_factory_ =
nullptr;
// static
CertProvisioningWorkerFactory* CertProvisioningWorkerFactory::Get() {
if (test_factory_) [[unlikely]] {
return test_factory_;
}
static base::NoDestructor<CertProvisioningWorkerFactory> factory;
return factory.get();
}
std::unique_ptr<CertProvisioningWorker> CertProvisioningWorkerFactory::Create(
std::string process_id,
CertScope cert_scope,
Profile* profile,
PrefService* pref_service,
const CertProfile& cert_profile,
CertProvisioningClient* cert_provisioning_client,
std::unique_ptr<CertProvisioningInvalidator> invalidator,
base::RepeatingClosure state_change_callback,
CertProvisioningWorkerCallback result_callback) {
RecordEvent(cert_profile.protocol_version, cert_scope,
CertProvisioningEvent::kWorkerCreated);
switch (cert_profile.protocol_version) {
case ProtocolVersion::kStatic:
return std::make_unique<CertProvisioningWorkerStatic>(
process_id, cert_scope, profile, pref_service, cert_profile,
cert_provisioning_client, std::move(invalidator),
std::move(state_change_callback), std::move(result_callback));
case ProtocolVersion::kDynamic:
return std::make_unique<CertProvisioningWorkerDynamic>(
process_id, cert_scope, profile, pref_service, cert_profile,
cert_provisioning_client, std::move(invalidator),
std::move(state_change_callback), std::move(result_callback));
}
}
std::unique_ptr<CertProvisioningWorker> CreateAndDeserializeWorker(
ProtocolVersion protocol_version,
CertScope cert_scope,
Profile* profile,
PrefService* pref_service,
const base::Value::Dict& saved_worker,
CertProvisioningClient* cert_provisioning_client,
std::unique_ptr<CertProvisioningInvalidator> invalidator,
base::RepeatingClosure state_change_callback,
CertProvisioningWorkerCallback result_callback) {
switch (protocol_version) {
case ProtocolVersion::kStatic: {
auto worker = std::make_unique<CertProvisioningWorkerStatic>(
/*process_id=*/"", cert_scope, profile, pref_service, CertProfile(),
cert_provisioning_client, std::move(invalidator),
std::move(state_change_callback), std::move(result_callback));
if (!CertProvisioningSerializer::DeserializeWorker(saved_worker,
worker.get())) {
return {};
}
return worker;
}
case ProtocolVersion::kDynamic: {
auto worker = std::make_unique<CertProvisioningWorkerDynamic>(
/*process_id=*/"", cert_scope, profile, pref_service, CertProfile(),
cert_provisioning_client, std::move(invalidator),
std::move(state_change_callback), std::move(result_callback));
if (!CertProvisioningSerializer::DeserializeWorker(saved_worker,
worker.get())) {
return {};
}
return worker;
}
}
}
std::unique_ptr<CertProvisioningWorker>
CertProvisioningWorkerFactory::Deserialize(
CertScope cert_scope,
Profile* profile,
PrefService* pref_service,
const base::Value::Dict& saved_worker,
CertProvisioningClient* cert_provisioning_client,
std::unique_ptr<CertProvisioningInvalidator> invalidator,
base::RepeatingClosure state_change_callback,
CertProvisioningWorkerCallback result_callback) {
std::optional<ProtocolVersion> protocol_version =
CertProvisioningSerializer::GetProtocolVersion(saved_worker);
if (!protocol_version) {
LOG(ERROR) << "Could not parse protocol version";
return {};
}
std::unique_ptr<CertProvisioningWorker> worker = CreateAndDeserializeWorker(
*protocol_version, cert_scope, profile, pref_service, saved_worker,
cert_provisioning_client, std::move(invalidator),
std::move(state_change_callback), std::move(result_callback));
if (!worker) {
RecordEvent(*protocol_version, cert_scope,
CertProvisioningEvent::kWorkerDeserializationFailed);
return {};
}
CHECK_EQ(worker->GetCertProfile().protocol_version, *protocol_version);
RecordEvent(*protocol_version, cert_scope,
CertProvisioningEvent::kWorkerDeserialized);
return worker;
}
// static
void CertProvisioningWorkerFactory::SetFactoryForTesting(
CertProvisioningWorkerFactory* test_factory) {
test_factory_ = test_factory;
}
} // namespace cert_provisioning
} // namespace ash
|