blob: 3bf182b6d32b6f4e666c8be03369e12d05dbd4b9 [file] [log] [blame]
// Copyright 2025 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_SSL_SSL_CONFIG_OVERLAY_H_
#define CHROME_BROWSER_SSL_SSL_CONFIG_OVERLAY_H_
#include "mojo/public/cpp/bindings/receiver.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "services/network/public/mojom/network_context.mojom-forward.h"
#include "services/network/public/mojom/ssl_config.mojom.h"
// This object can be instantiated by a configurer of NetworkContexts that wants
// to apply overrides to certain fields in the SSLConfig whose values may
// differ from the global values (e.g. for specific per-Profile settings that do
// not apply globally).
//
// This object is initialized with a NetworkContextParams (containing the
// initial global SSLConfig and a pending SSLConfigClient receiver) obtained
// from SSLConfigServiceManager::AddToNetworkContextParams(). It applies the
// specific override config settings, and inserts itself in front of the
// original SSLConfigClient Mojo pipe to intercept calls. It passes along global
// updates it receives (after applying its overrides), and also updates the
// downstream SSLConfigClient when the specific override settings are updated.
class SSLConfigOverlay : public network::mojom::SSLConfigClient {
public:
// Callback that updates the config with the specific override settings.
using OverrideConfigCallback =
base::RepeatingCallback<void(network::mojom::SSLConfig*)>;
explicit SSLConfigOverlay(OverrideConfigCallback callback);
~SSLConfigOverlay() override;
SSLConfigOverlay(const SSLConfigOverlay&) = delete;
SSLConfigOverlay& operator=(const SSLConfigOverlay&) = delete;
// Applies the specific overrides to
// `network_context_params->initial_ssl_config`, and steals the original
// SSLConfigClient pipe from
// `network_context_params->ssl_config_client_receiver` so that we can insert
// ourselves in the middle. May only be called once. Returns whether
// initialization succeeded at binding both Mojo pipes.
bool Init(network::mojom::NetworkContextParams* network_context_params);
// Should be called when the relevant override settings change. Recomputes the
// overridden config by applying the overrides to the last global config, then
// notifies the downstream SSLConfigClient.
void Update();
// Whether this object is able to relay updates (has both Mojo pipes bound).
// If this ever becomes unbound after being initialized, it is no longer
// functional so might as well be cleaned up.
bool IsBound() const;
// network::mojom::SSLConfigClient implementation:
void OnSSLConfigUpdated(network::mojom::SSLConfigPtr ssl_config) override;
void FlushForTesting();
private:
// Applies the override settings to `config` and then notifies the downstream
// SSLConfigClient.
void ApplyOverridesAndNotify(network::mojom::SSLConfigPtr config);
// Resets both Mojo pipes.
void OnDisconnect();
// Called to override specific settings on the SSLConfig.
OverrideConfigCallback override_callback_;
// Will receive updates about changes to the original (global) config.
mojo::Receiver<network::mojom::SSLConfigClient> receiver_{this};
// The downstream client, to be notified on global changes and override
// changes.
mojo::Remote<network::mojom::SSLConfigClient> ssl_config_client_;
// Cached copy of the last global config.
network::mojom::SSLConfigPtr last_global_config_;
};
#endif // CHROME_BROWSER_SSL_SSL_CONFIG_OVERLAY_H_