blob: 6d8ea50860ec59095367f6d220f897ab81a0acb8 [file]
// Copyright 2026 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "services/network/device_bound_session_service_delegate.h"
#include "net/cert/x509_certificate.h"
#include "net/ssl/ssl_cert_request_info.h"
#include "net/ssl/ssl_private_key.h"
#include "services/network/ssl_private_key_proxy.h"
namespace network {
DeviceBoundSessionServiceDelegate::DeviceBoundSessionServiceDelegate(
mojo::PendingRemote<mojom::URLLoaderNetworkServiceObserver>
url_loader_network_observer) {
if (url_loader_network_observer) {
url_loader_network_observer_.Bind(std::move(url_loader_network_observer));
}
receivers_.set_disconnect_handler(base::BindRepeating(
&DeviceBoundSessionServiceDelegate::OnReceiverDisconnected,
base::Unretained(this)));
}
DeviceBoundSessionServiceDelegate::~DeviceBoundSessionServiceDelegate() =
default;
void DeviceBoundSessionServiceDelegate::SelectClientCertificate(
const GURL& url,
scoped_refptr<net::SSLCertRequestInfo> cert_info,
net::device_bound_sessions::SelectClientCertificateCallback callback) {
if (!url_loader_network_observer_ ||
!url_loader_network_observer_.is_bound()) {
std::move(callback).Run(nullptr, nullptr, /*cancel=*/true);
return;
}
mojo::PendingRemote<mojom::ClientCertificateResponder> cert_responder;
receivers_.Add(this, cert_responder.InitWithNewPipeAndPassReceiver(),
std::move(callback));
url_loader_network_observer_->OnCertificateRequested(
std::nullopt, std::move(cert_info), std::move(cert_responder));
}
void DeviceBoundSessionServiceDelegate::ContinueWithCertificate(
const scoped_refptr<net::X509Certificate>& x509_certificate,
const std::string& provider_name,
const std::vector<uint16_t>& algorithm_preferences,
mojo::PendingRemote<mojom::SSLPrivateKey> ssl_private_key) {
auto callback = std::move(receivers_.current_context());
receivers_.Remove(receivers_.current_receiver());
scoped_refptr<net::SSLPrivateKey> proxy_key =
base::MakeRefCounted<SSLPrivateKeyProxy>(
provider_name, algorithm_preferences, std::move(ssl_private_key));
std::move(callback).Run(x509_certificate, std::move(proxy_key),
/*cancel=*/false);
}
void DeviceBoundSessionServiceDelegate::ContinueWithoutCertificate() {
auto callback = std::move(receivers_.current_context());
receivers_.Remove(receivers_.current_receiver());
std::move(callback).Run(nullptr, nullptr, /*cancel=*/false);
}
void DeviceBoundSessionServiceDelegate::CancelRequest() {
auto callback = std::move(receivers_.current_context());
receivers_.Remove(receivers_.current_receiver());
std::move(callback).Run(nullptr, nullptr, /*cancel=*/true);
}
void DeviceBoundSessionServiceDelegate::OnReceiverDisconnected() {
auto callback = std::move(receivers_.current_context());
std::move(callback).Run(nullptr, nullptr, /*cancel=*/true);
}
} // namespace network