#ifndef CHROME_BROWSER_ASH_ATTESTATION_ENROLLMENT_CERTIFICATE_UPLOADER_IMPL_H_
#define CHROME_BROWSER_ASH_ATTESTATION_ENROLLMENT_CERTIFICATE_UPLOADER_IMPL_H_
#include <memory>
#include <queue>
#include <string>
#include "base/functional/callback.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/time/time.h"
#include "chrome/browser/ash/attestation/enrollment_certificate_uploader.h"
#include "chromeos/ash/components/attestation/attestation_flow.h"
#include "chromeos/ash/components/dbus/constants/attestation_constants.h"
#include "components/policy/core/common/cloud/cloud_policy_client.h"
namespace ash {
namespace attestation {
class AttestationFeatures;
class EnrollmentCertificateUploaderImpl : public EnrollmentCertificateUploader {
public:
explicit EnrollmentCertificateUploaderImpl(
policy::CloudPolicyClient* policy_client);
EnrollmentCertificateUploaderImpl(const EnrollmentCertificateUploaderImpl&) =
delete;
EnrollmentCertificateUploaderImpl& operator=(
const EnrollmentCertificateUploaderImpl&) = delete;
~EnrollmentCertificateUploaderImpl() override;
void set_retry_limit_for_testing(int limit) { retry_limit_ = limit; }
void set_retry_delay_for_testing(base::TimeDelta retry_delay) {
retry_delay_ = retry_delay;
}
void set_attestation_flow_for_testing(AttestationFlow* attestation_flow) {
attestation_flow_ = attestation_flow;
}
void ObtainAndUploadCertificate(UploadCallback callback) override;
private:
void Start();
void GetCertificate();
void OnGetFeaturesReady(
AttestationFlow::CertificateCallback callback,
const ash::attestation::AttestationFeatures* features);
void HandleGetCertificateFailure(AttestationStatus status);
void UploadCertificateIfNeeded(const std::string& pem_certificate_chain);
void OnUploadComplete(policy::CloudPolicyClient::Result result);
bool Reschedule();
void RunCallbacks(Status status);
raw_ptr<policy::CloudPolicyClient, DanglingUntriaged> policy_client_;
std::unique_ptr<AttestationFlow> default_attestation_flow_;
raw_ptr<AttestationFlow> attestation_flow_ = nullptr;
std::queue<UploadCallback> callbacks_;
int num_retries_;
int retry_limit_;
base::TimeDelta retry_delay_;
bool has_already_uploaded_ = false;
base::WeakPtrFactory<EnrollmentCertificateUploaderImpl> weak_factory_{this};
};
}
}
#endif