// Copyright 2022 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_POLICY_ENROLLMENT_PSM_RLWE_DMSERVER_CLIENT_H_
#define CHROME_BROWSER_ASH_POLICY_ENROLLMENT_PSM_RLWE_DMSERVER_CLIENT_H_
#include <optional>
#include "base/functional/callback.h"
#include "base/time/time.h"
#include "chrome/browser/ash/policy/enrollment/auto_enrollment_state.h"
namespace policy::psm {
// Indicates all possible PSM protocol results after it has executed
// successfully or terminated because of an error or timeout. These values are
// persisted to logs. Entries should not be renumbered and numeric values should
// never be reused.
enum class RlweResult {
kSuccessfulDetermination = 0,
kCreateRlweClientLibraryError = 1,
kCreateOprfRequestLibraryError = 2,
kCreateQueryRequestLibraryError = 3,
kProcessingQueryResponseLibraryError = 4,
kEmptyOprfResponseError = 5,
kEmptyQueryResponseError = 6,
kConnectionError = 7,
kServerError = 8,
// [deleted] kTimeout = 9,
kMaxValue = kServerError,
};
// Interface for the PSM RLWE Client which uses DMServer, allowing to replace
// the PSM RLWE DMServer client with a fake for tests.
class RlweDmserverClient {
public:
struct ResultHolder final {
ResultHolder(bool membership_result,
base::Time membership_determination_time)
: psm_result(RlweResult::kSuccessfulDetermination),
membership_result(membership_result),
membership_determination_time(membership_determination_time) {}
explicit ResultHolder(AutoEnrollmentDMServerError dm_server_error)
: psm_result(dm_server_error.network_error.has_value()
? RlweResult::kConnectionError
: RlweResult::kServerError),
dm_server_error(dm_server_error) {}
explicit ResultHolder(RlweResult result) : psm_result(result) {
CHECK_NE(result, RlweResult::kSuccessfulDetermination);
CHECK_NE(result, RlweResult::kConnectionError);
CHECK_NE(result, RlweResult::kServerError);
}
// Indicate whether an error occurred while executing the PSM protocol.
bool IsError() const {
return psm_result != RlweResult::kSuccessfulDetermination;
}
RlweResult psm_result;
// The field has value iff `psm_result` value is
// `kConnectionError` or `kServerError`.
std::optional<AutoEnrollmentDMServerError> dm_server_error;
// These fields have values iff `psm_result` value is
// `kSuccessfulDetermination`.
std::optional<bool> membership_result;
std::optional<base::Time> membership_determination_time;
};
// Callback will be triggered after completing the protocol, in case of a
// successful determination or stopping due to an error.
using CompletionCallback =
base::OnceCallback<void(ResultHolder result_holder)>;
virtual ~RlweDmserverClient() = default;
// Determines the membership. Then, will call `callback` on
// successful result or error. Also, the `callback` has to be non-null.
// Note: This method should be called only when there is no PSM request in
// progress (i.e. `IsCheckMembershipInProgress` is false).
virtual void CheckMembership(CompletionCallback callback) = 0;
// Returns true if the PSM protocol is still running,
// otherwise false.
virtual bool IsCheckMembershipInProgress() const = 0;
};
} // namespace policy::psm
#endif // CHROME_BROWSER_ASH_POLICY_ENROLLMENT_PSM_RLWE_DMSERVER_CLIENT_H_