Add absl::AnyInvocable to SSLStreamAdapter::Create

Remove internal use of SignalSSLHandshakeError and prepare removal of
sigslot dependency from SSLStreamAdapter.

Bug: webrtc:11943
Change-Id: I9768e2e31529945620bdd8d0d285042bb2388b7b
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/318881
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Commit-Queue: Tomas Gunnarsson <tommi@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#40695}
This commit is contained in:
Tommi 2023-09-05 09:21:57 +02:00 committed by WebRTC LUCI CQ
parent 7cc1ca26c8
commit 59574ca6d3
6 changed files with 27 additions and 9 deletions

View file

@ -357,7 +357,9 @@ bool DtlsTransport::SetupDtls() {
auto downward = std::make_unique<StreamInterfaceChannel>(ice_transport_);
StreamInterfaceChannel* downward_ptr = downward.get();
dtls_ = rtc::SSLStreamAdapter::Create(std::move(downward));
dtls_ = rtc::SSLStreamAdapter::Create(
std::move(downward),
[this](rtc::SSLHandshakeError error) { OnDtlsHandshakeError(error); });
if (!dtls_) {
RTC_LOG(LS_ERROR) << ToString() << ": Failed to create DTLS adapter.";
return false;
@ -370,8 +372,6 @@ bool DtlsTransport::SetupDtls() {
dtls_->SetMaxProtocolVersion(ssl_max_version_);
dtls_->SetServerRole(*dtls_role_);
dtls_->SignalEvent.connect(this, &DtlsTransport::OnDtlsEvent);
dtls_->SignalSSLHandshakeError.connect(this,
&DtlsTransport::OnDtlsHandshakeError);
if (remote_fingerprint_value_.size() &&
!dtls_->SetPeerCertificateDigest(
remote_fingerprint_algorithm_,

View file

@ -1548,6 +1548,7 @@ rtc_library("ssl") {
absl_deps = [
"//third_party/abseil-cpp/absl/algorithm:container",
"//third_party/abseil-cpp/absl/base:core_headers",
"//third_party/abseil-cpp/absl/functional:any_invocable",
"//third_party/abseil-cpp/absl/memory",
"//third_party/abseil-cpp/absl/strings",
"//third_party/abseil-cpp/absl/types:optional",

View file

@ -294,8 +294,10 @@ bool ShouldAllowLegacyTLSProtocols() {
}
OpenSSLStreamAdapter::OpenSSLStreamAdapter(
std::unique_ptr<StreamInterface> stream)
std::unique_ptr<StreamInterface> stream,
absl::AnyInvocable<void(SSLHandshakeError)> handshake_error)
: stream_(std::move(stream)),
handshake_error_(std::move(handshake_error)),
owner_(rtc::Thread::Current()),
state_(SSL_NONE),
role_(SSL_CLIENT),
@ -938,7 +940,13 @@ int OpenSSLStreamAdapter::ContinueSSL() {
}
RTC_DLOG(LS_VERBOSE) << " -- error " << code << ", " << err_code << ", "
<< ERR_GET_REASON(err_code);
SignalSSLHandshakeError(ssl_handshake_err);
if (handshake_error_) {
handshake_error_(ssl_handshake_err);
} else {
// TODO(bugs.webrtc.org/11943): SignalSSLHandshakeError usage has been
// deprecated. Remove once external usage has been cleaned up.
SignalSSLHandshakeError(ssl_handshake_err);
}
return (ssl_error != 0) ? ssl_error : -1;
}

View file

@ -19,6 +19,7 @@
#include <string>
#include <vector>
#include "absl/functional/any_invocable.h"
#include "absl/strings/string_view.h"
#include "absl/types/optional.h"
#include "rtc_base/buffer.h"
@ -72,7 +73,9 @@ RTC_EXPORT void SetAllowLegacyTLSProtocols(const absl::optional<bool>& allow);
class OpenSSLStreamAdapter final : public SSLStreamAdapter {
public:
explicit OpenSSLStreamAdapter(std::unique_ptr<StreamInterface> stream);
OpenSSLStreamAdapter(
std::unique_ptr<StreamInterface> stream,
absl::AnyInvocable<void(SSLHandshakeError)> handshake_error);
~OpenSSLStreamAdapter() override;
void SetIdentity(std::unique_ptr<SSLIdentity> identity) override;
@ -202,6 +205,7 @@ class OpenSSLStreamAdapter final : public SSLStreamAdapter {
}
const std::unique_ptr<StreamInterface> stream_;
absl::AnyInvocable<void(SSLHandshakeError)> handshake_error_;
rtc::Thread* const owner_;
webrtc::ScopedTaskSafety task_safety_;

View file

@ -91,8 +91,10 @@ bool IsGcmCryptoSuiteName(absl::string_view crypto_suite) {
}
std::unique_ptr<SSLStreamAdapter> SSLStreamAdapter::Create(
std::unique_ptr<StreamInterface> stream) {
return std::make_unique<OpenSSLStreamAdapter>(std::move(stream));
std::unique_ptr<StreamInterface> stream,
absl::AnyInvocable<void(SSLHandshakeError)> handshake_error) {
return std::make_unique<OpenSSLStreamAdapter>(std::move(stream),
std::move(handshake_error));
}
bool SSLStreamAdapter::GetSslCipherSuite(int* cipher_suite) {

View file

@ -18,6 +18,7 @@
#include <string>
#include <vector>
#include "absl/functional/any_invocable.h"
#include "absl/memory/memory.h"
#include "absl/strings/string_view.h"
#include "rtc_base/ssl_certificate.h"
@ -118,7 +119,8 @@ class SSLStreamAdapter : public StreamInterface, public sigslot::has_slots<> {
// (using the selected implementation for the platform).
// Caller is responsible for freeing the returned object.
static std::unique_ptr<SSLStreamAdapter> Create(
std::unique_ptr<StreamInterface> stream);
std::unique_ptr<StreamInterface> stream,
absl::AnyInvocable<void(SSLHandshakeError)> handshake_error = nullptr);
SSLStreamAdapter() = default;
~SSLStreamAdapter() override = default;
@ -261,6 +263,7 @@ class SSLStreamAdapter : public StreamInterface, public sigslot::has_slots<> {
// authentication.
bool GetClientAuthEnabled() const { return client_auth_enabled_; }
// TODO(bugs.webrtc.org/11943): Remove after updating downstream code.
sigslot::signal1<SSLHandshakeError> SignalSSLHandshakeError;
private: