| // 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. |
| |
| #ifndef CHROME_BROWSER_ASH_CERT_PROVISIONING_CERT_PROVISIONING_WORKER_H_ |
| #define CHROME_BROWSER_ASH_CERT_PROVISIONING_CERT_PROVISIONING_WORKER_H_ |
| |
| #include <stddef.h> |
| |
| #include <memory> |
| #include <optional> |
| #include <string> |
| #include <vector> |
| |
| #include "base/functional/callback_forward.h" |
| #include "base/time/time.h" |
| #include "chrome/browser/ash/cert_provisioning/cert_provisioning_client.h" |
| #include "chrome/browser/ash/cert_provisioning/cert_provisioning_common.h" |
| #include "components/policy/proto/device_management_backend.pb.h" |
| |
| class Profile; |
| class PrefService; |
| |
| namespace ash { |
| namespace cert_provisioning { |
| |
| class CertProvisioningInvalidator; |
| |
| // A OnceCallback that is invoked when the CertProvisioningWorker is done and |
| // has a result (which could be success or failure). |
| using CertProvisioningWorkerCallback = |
| base::OnceCallback<void(CertProfile profile, |
| std::string process_id, |
| CertProvisioningWorkerState state)>; |
| |
| class CertProvisioningWorker; |
| |
| struct BackendServerError { |
| // info on the last failed DMServer call attempt. |
| BackendServerError(policy::DeviceManagementStatus dm_status, |
| base::Time error_time) |
| : time(error_time), status(dm_status) {} |
| |
| base::Time time; |
| policy::DeviceManagementStatus status; |
| }; |
| |
| class CertProvisioningWorkerFactory { |
| public: |
| virtual ~CertProvisioningWorkerFactory() = default; |
| |
| static CertProvisioningWorkerFactory* Get(); |
| |
| virtual std::unique_ptr<CertProvisioningWorker> 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); |
| |
| virtual std::unique_ptr<CertProvisioningWorker> 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); |
| |
| // Doesn't take ownership. |
| static void SetFactoryForTesting(CertProvisioningWorkerFactory* test_factory); |
| |
| private: |
| static CertProvisioningWorkerFactory* test_factory_; |
| }; |
| |
| // This class is a part of certificate provisioning feature. It takes a |
| // certificate profile, generates a key pair, communicates with DM Server to |
| // create a CSR for it and request a certificate, and imports it. |
| class CertProvisioningWorker { |
| public: |
| CertProvisioningWorker() = default; |
| CertProvisioningWorker(const CertProvisioningWorker&) = delete; |
| CertProvisioningWorker& operator=(const CertProvisioningWorker&) = delete; |
| virtual ~CertProvisioningWorker() = default; |
| |
| // Continue provisioning a certificate. |
| virtual void DoStep() = 0; |
| // Sets worker's state to one of final ones. That triggers corresponding |
| // clean ups (deletes serialized state, keys, and so on) and returns |state| |
| // via callback. |
| virtual void Stop(CertProvisioningWorkerState state) = 0; |
| // Make worker pause all activity and wait for DoStep. |
| virtual void Pause() = 0; |
| // Mark worker that it is undergoing a reset process. |
| virtual void MarkWorkerForReset() = 0; |
| // Returns true, if the worker is waiting for some future event. |DoStep| can |
| // be called to try continue right now. |
| virtual bool IsWaiting() const = 0; |
| // Returns true if the worker is to be recreated due to a user-initiated |
| // "reset" action. |
| virtual bool IsWorkerMarkedForReset() const = 0; |
| // Returns the certificate provisioning process id. |
| virtual const std::string& GetProcessId() const = 0; |
| // Returns CertProfile that this worker is working on. |
| virtual const CertProfile& GetCertProfile() const = 0; |
| // Returns public key or an empty string if the key is not created yet. |
| virtual const std::vector<uint8_t>& GetPublicKey() const = 0; |
| // Returns current state. |
| virtual CertProvisioningWorkerState GetState() const = 0; |
| // Returns state that was before the current one. Especially helpful on failed |
| // workers. |
| virtual CertProvisioningWorkerState GetPreviousState() const = 0; |
| // Returns the time when this worker has been last updated. |
| virtual base::Time GetLastUpdateTime() const = 0; |
| // Return the info of when this worker has last faced an unsuccessful attempt. |
| virtual const std::optional<BackendServerError>& GetLastBackendServerError() |
| const = 0; |
| // Return a message describing the reason for failure when the worker fails. |
| // In case the worker did not fail, the message is empty. It can be shown in |
| // the UI, but should not be logged. |
| virtual std::string GetFailureMessageWithPii() const = 0; |
| }; |
| |
| } // namespace cert_provisioning |
| } // namespace ash |
| |
| #endif // CHROME_BROWSER_ASH_CERT_PROVISIONING_CERT_PROVISIONING_WORKER_H_ |