blob: d08ac3a8f50cd389f2f1e9f3eb7907f540bac069 [file] [log] [blame]
// 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_INVALIDATOR_H_
#define CHROME_BROWSER_ASH_CERT_PROVISIONING_CERT_PROVISIONING_INVALIDATOR_H_
#include <memory>
#include <string>
#include "base/functional/callback.h"
#include "base/memory/raw_ptr.h"
#include "base/scoped_observation.h"
#include "base/sequence_checker.h"
#include "components/invalidation/invalidation_listener.h"
class Profile;
namespace ash::cert_provisioning {
enum class InvalidationEvent {
// The client has successfully subscribed to the invalidation topic.
// This is relevant because if an invalidation was published for that
// invalidation topic before the client has successfully subscribed, the
// client will not receive that invalidation.
// This could be called multiple times because the registration could need to
// be re-established by the FCM client.
kSuccessfullySubscribed,
// An invalidation has been received.
kInvalidationReceived,
};
using OnInvalidationEventCallback =
base::RepeatingCallback<void(InvalidationEvent invalidation_event)>;
//=============== CertProvisioningInvalidationHandler ==========================
namespace internal {
// Responsible for listening to events of certificate invalidations.
class CertProvisioningInvalidationHandler
: public invalidation::InvalidationListener::Observer {
public:
// Creates and registers the handler to `invalidation_listener`
// with `listener_type`.
// `on_invalidation_event_callback` will be called when incoming invalidation
// is received.
CertProvisioningInvalidationHandler(
invalidation::InvalidationListener* invalidation_listener,
const std::string& listener_type,
OnInvalidationEventCallback on_invalidation_event_callback);
CertProvisioningInvalidationHandler(
const CertProvisioningInvalidationHandler&) = delete;
CertProvisioningInvalidationHandler& operator=(
const CertProvisioningInvalidationHandler&) = delete;
~CertProvisioningInvalidationHandler() override;
// invalidation::InvalidationListener::Observer
void OnExpectationChanged(
invalidation::InvalidationsExpected expected) override;
void OnInvalidationReceived(
const invalidation::DirectInvalidation& invalidation) override;
std::string GetType() const override;
private:
// Returns true if ready to receive invalidations.
bool IsRegistered() const;
// Returns true if ready to receive invalidations and invalidations are
// enabled.
bool AreInvalidationsEnabled() const;
// Sequence checker to ensure that calls from invalidation service are
// consecutive.
SEQUENCE_CHECKER(sequence_checker_);
// An invalidation service providing the handler with incoming invalidations.
const raw_ptr<invalidation::InvalidationListener> invalidation_listener_;
// A listener type for routing FCM invalidations.
const std::string listener_type_;
invalidation::InvalidationsExpected are_invalidations_expected_ =
invalidation::InvalidationsExpected::kMaybe;
// A callback to be called on incoming invalidation event.
const OnInvalidationEventCallback on_invalidation_event_callback_;
// Automatically unregisters `this` as an observer on destruction. Should be
// destroyed first so the other fields are still valid and can be used during
// the unregistration.
base::ScopedObservation<invalidation::InvalidationListener,
invalidation::InvalidationListener::Observer>
invalidation_listener_observation_{this};
};
} // namespace internal
//=============== CertProvisioningInvalidatorFactory ===========================
class CertProvisioningInvalidator;
// Interface for a factory that creates CertProvisioningInvalidators.
class CertProvisioningInvalidatorFactory {
public:
CertProvisioningInvalidatorFactory() = default;
CertProvisioningInvalidatorFactory(
const CertProvisioningInvalidatorFactory&) = delete;
CertProvisioningInvalidatorFactory& operator=(
const CertProvisioningInvalidatorFactory&) = delete;
virtual ~CertProvisioningInvalidatorFactory() = default;
virtual std::unique_ptr<CertProvisioningInvalidator> Create() = 0;
};
//=============== CertProvisioningInvalidator ==================================
// An invalidator that calls a Callback when an invalidation for a specific
// topic has been received. Register can be called multiple times for the same
// topic (e.g. after a chrome restart).
class CertProvisioningInvalidator {
public:
CertProvisioningInvalidator();
CertProvisioningInvalidator(const CertProvisioningInvalidator&) = delete;
CertProvisioningInvalidator& operator=(const CertProvisioningInvalidator&) =
delete;
virtual ~CertProvisioningInvalidator();
virtual void Register(
const std::string& listener_type,
OnInvalidationEventCallback on_invalidation_event_callback) = 0;
virtual void Unregister();
protected:
std::unique_ptr<internal::CertProvisioningInvalidationHandler>
invalidation_handler_;
};
//=============== CertProvisioningUserInvalidatorFactory =======================
// This factory creates CertProvisioningInvalidators that use the passed user
// Profile's `InvalidationListener`.
class CertProvisioningUserInvalidatorFactory
: public CertProvisioningInvalidatorFactory {
public:
explicit CertProvisioningUserInvalidatorFactory(Profile* profile);
std::unique_ptr<CertProvisioningInvalidator> Create() override;
private:
raw_ptr<Profile> profile_ = nullptr;
};
//=============== CertProvisioningUserInvalidator ==============================
class CertProvisioningUserInvalidator : public CertProvisioningInvalidator {
public:
explicit CertProvisioningUserInvalidator(Profile* profile);
void Register(
const std::string& listener_type,
OnInvalidationEventCallback on_invalidation_event_callback) override;
private:
raw_ptr<Profile> profile_ = nullptr;
};
//=============== CertProvisioningDeviceInvalidatorFactory =====================
// This factory creates CertProvisioningInvalidators that use the device-wide
// `InvalidationListener`.
class CertProvisioningDeviceInvalidatorFactory
: public CertProvisioningInvalidatorFactory {
public:
CertProvisioningDeviceInvalidatorFactory();
~CertProvisioningDeviceInvalidatorFactory() override;
explicit CertProvisioningDeviceInvalidatorFactory(
invalidation::InvalidationListener* invalidation__listener);
std::unique_ptr<CertProvisioningInvalidator> Create() override;
private:
raw_ptr<invalidation::InvalidationListener> invalidation_listener_;
};
//=============== CertProvisioningDeviceInvalidator ============================
class CertProvisioningDeviceInvalidator : public CertProvisioningInvalidator {
public:
explicit CertProvisioningDeviceInvalidator(
invalidation::InvalidationListener* invalidation_listener);
~CertProvisioningDeviceInvalidator() override;
void Register(
const std::string& listener_type,
OnInvalidationEventCallback on_invalidation_event_callback) override;
private:
std::string listener_type_;
OnInvalidationEventCallback on_invalidation_event_callback_;
raw_ptr<invalidation::InvalidationListener> invalidation_listener_;
};
} // namespace ash::cert_provisioning
#endif // CHROME_BROWSER_ASH_CERT_PROVISIONING_CERT_PROVISIONING_INVALIDATOR_H_