blob: 4f556ffc3b7d64031f7631837e3250b353b53f6e [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.
#include "chrome/browser/ssl/ssl_config_overlay.h"
#include "services/network/public/mojom/network_context.mojom.h"
SSLConfigOverlay::SSLConfigOverlay(OverrideConfigCallback callback)
: override_callback_(std::move(callback)) {
CHECK(override_callback_);
}
SSLConfigOverlay::~SSLConfigOverlay() = default;
bool SSLConfigOverlay::Init(
network::mojom::NetworkContextParams* network_context_params) {
CHECK(!last_global_config_);
CHECK(!receiver_.is_bound());
CHECK(!ssl_config_client_.is_bound());
if (network_context_params->initial_ssl_config) {
last_global_config_ = network_context_params->initial_ssl_config->Clone();
override_callback_.Run(network_context_params->initial_ssl_config.get());
}
if (network_context_params->ssl_config_client_receiver) {
receiver_.Bind(
std::move(network_context_params->ssl_config_client_receiver));
network_context_params->ssl_config_client_receiver =
ssl_config_client_.BindNewPipeAndPassReceiver();
// Propagate a disconnect on either end of the pipe to the other end.
receiver_.set_disconnect_handler(base::BindOnce(
&SSLConfigOverlay::OnDisconnect, base::Unretained(this)));
ssl_config_client_.set_disconnect_handler(base::BindOnce(
&SSLConfigOverlay::OnDisconnect, base::Unretained(this)));
}
return IsBound();
}
void SSLConfigOverlay::Update() {
ApplyOverridesAndNotify(last_global_config_.Clone());
}
bool SSLConfigOverlay::IsBound() const {
return ssl_config_client_.is_bound() && receiver_.is_bound();
}
void SSLConfigOverlay::OnSSLConfigUpdated(
network::mojom::SSLConfigPtr ssl_config) {
last_global_config_ = ssl_config->Clone();
ApplyOverridesAndNotify(std::move(ssl_config));
}
void SSLConfigOverlay::FlushForTesting() {
receiver_.FlushForTesting(); // IN-TEST
if (ssl_config_client_) {
ssl_config_client_.FlushForTesting(); // IN-TEST
}
}
void SSLConfigOverlay::ApplyOverridesAndNotify(
network::mojom::SSLConfigPtr config) {
override_callback_.Run(config.get());
if (ssl_config_client_.is_bound()) {
ssl_config_client_->OnSSLConfigUpdated(std::move(config));
}
}
void SSLConfigOverlay::OnDisconnect() {
ssl_config_client_.reset();
receiver_.reset();
}