curl-fuzzer C++ reference
Loading...
Searching...
No Matches
proto_fuzzer::LdapsMockServer Class Referencefinal

Runs the LDAP bind/search exchange over implicit TLS. More...

#include <ldaps_mock_server.h>

Inheritance diagram for proto_fuzzer::LdapsMockServer:
proto_fuzzer::LdapMockServer proto_fuzzer::MockServerBase proto_fuzzer::IncomingDataObserver

Public Member Functions

 LdapsMockServer ()
 Construct the OpenSSL server carrier used by every LDAPS scenario.
 ~LdapsMockServer () override
 Release the TLS connection before the carrier-owned server context.
void ObserveState () override
 Retain protocol outcomes in coverage and introspector builds.
void Install (CURL *easy) override
 Install the shared socket callbacks and a stable local trust anchor.
int negotiated_tls_version () const
std::size_t completed_handshake_count () const
std::string negotiated_alpn () const
Public Member Functions inherited from proto_fuzzer::LdapMockServer
 LdapMockServer ()
 Begin without a borrowed protobuf or open socketpair.
 ~LdapMockServer () override
 Release the server-owned socketpair half after curl has returned its client descriptor.
void ObserveIncomingData (const unsigned char *data, std::size_t size) override
 Append one fragment after the transport has decoded it.
const std::string & packet_transcript () const
std::size_t bind_request_count () const
std::size_t search_request_count () const
std::size_t mechanism_search_request_count () const
std::size_t starttls_request_count () const
std::size_t unbind_request_count () const
std::size_t server_message_count () const
std::size_t scripted_message_count () const
std::size_t synthesized_done_count () const
std::size_t scripted_bind_response_count () const
Public Member Functions inherited from proto_fuzzer::MockServerBase
virtual ~MockServerBase ()
 Out-of-line destructor so MockConnection can stay forward-declared in the base header (its complete type is only needed where unique_ptr is instantiated for destruction).
virtual void ConfigureRequestData (ScenarioRequestData *request_data)
 Bind protocol-specific work to the request-data callbacks after their per-scenario state has been constructed.
CURLcode DriveScenario (CURL *easy, const curl::fuzzer::proto::Scenario &scenario)
 Run 'scenario' to completion on 'easy': allocate a multi, attach 'easy', delegate protocol-specific work to RunLoop, consume its completion message, and clean up.
virtual CURLcode DriveEasyScenario (CURL *easy, const curl::fuzzer::proto::Scenario &scenario, bool use_events=false)
 Run through the public easy entrypoint when a protocol mock can preload all peer work before curl takes control.
virtual ConnectOnlyRunStats DriveConnectOnlyScenario (CURL *easy, const curl::fuzzer::proto::Scenario &scenario)
 Establish a CONNECT_ONLY transport, then perform bounded direct I/O.
void SetMultiObserver (MultiObserver observer)
 Register an observer invoked with the live multi handle after 'easy' is attached and before the drive loop starts.
MockConnection * connection ()

Protected Member Functions

std::unique_ptr< MockConnection > CreateConnection () override
 Wrap one socketpair endpoint in an OpenSSL acceptor.
Protected Member Functions inherited from proto_fuzzer::LdapMockServer
curl_socket_t HandleOpenSocket (curlsocktype purpose=CURLSOCKTYPE_IPCXN, struct curl_sockaddr *address=nullptr) override
 Create the single LDAP socketpair.
void RunLoop (CURLM *multi, CURL *easy, const curl::fuzzer::proto::Scenario &scenario) override
 Alternate curl transitions with immediate peer service until the transfer completes or deterministic idle/operation caps win.
Protected Member Functions inherited from proto_fuzzer::MockServerBase
 MockServerBase (MultiDrivePolicy drive_policy=MultiDrivePolicy::kPerform)
 Construct an empty base instance with a fixed multi-drive policy.
virtual void HandleDetachedMulti (CurlMultiPtr multi)
 Dispose of or retain the multi after its easy handle has been removed.
virtual SocketSetupDisposition GetSocketSetupDisposition (curl_socket_t curlfd, curlsocktype purpose) const
 Describe the socket returned by HandleOpenSocket without issuing native descriptor queries.
MultiSocketDriver * multi_socket_driver ()
 Expose the callback state installed for the current socket-action drive.
std::size_t additional_handle_cleanup_count () const
void ResumeResponseIfRequested (CURL *easy)
 Resume receive-side callback output at one bounded drive boundary when the dedicated API plan requested it.
void ApplyPendingBackpressure ()
 Apply the BackpressureConfig cached by DriveScenario to the new connection_.

Additional Inherited Members

Public Types inherited from proto_fuzzer::MockServerBase
using MultiObserver = std::function<void(CURLM*)>
 Callback type used to publish the driving multi handle to observers.
Static Protected Member Functions inherited from proto_fuzzer::MockServerBase
static int WaitOnMultiFdset (CURLM *multi, CURLMcode *rc)
 Wait on curl's fdset with a short timeout.
static void ProbeMultiPollset (CURLM *multi)
 Ask curl to construct and inspect its connection-filter pollset without waiting.
static bool MultiPollsetWantsWrite (CURLM *multi, curl_socket_t socket)
 Inspect one socket's current writable interest through curl's public multi fdset API.
static bool UsesTimedDrive (const curl::fuzzer::proto::Scenario &scenario)
 Treat a non-default BackpressureConfig as an explicit request for the slower, timed drive policy.
Protected Attributes inherited from proto_fuzzer::MockServerBase
std::unique_ptr< MockConnection > connection_
 The per-scenario MockConnection, lazily created by HandleOpenSocket().
int pending_recv_buf_bytes_
 Cached SO_RCVBUF/SO_SNDBUF setting in bytes.
std::size_t pending_drain_limit_
 Cached per-call DrainIncoming byte budget.
MultiSocketDriver * multi_socket_driver_
 Non-owning pointer into DriveScenario's stack.
std::size_t additional_handle_cleanup_count_
 Number of application-created handles, excluding the caller's parent, successfully removed from the current multi and cleaned up.
bool resume_response_
 True only for an API-plan multi drive with its one-shot write callback.
MultiObserver multi_observer_
 Observer receiving the live multi handle at the start of a drive.
Static Protected Attributes inherited from proto_fuzzer::MockServerBase
static constexpr int kMaxDriveIterations = 512
 Hard operation budget for one scenario.
static constexpr int kMaxIdleIterations = 8
 Consecutive no-progress budget for ordinary scenarios.
static constexpr int kMaxTimedIdleIterations = 256
 Explicit backpressure scenarios get a larger idle budget and may use the short timed wait above.

Detailed Description

Runs the LDAP bind/search exchange over implicit TLS.

LDAPS differs from LDAP only in transport setup: curl establishes TLS immediately after CONNECT and then executes the same bindRequest and searchRequest exchange. This peer therefore inherits the BER-aware parser and replaces only the connection factory and trust installation.

OpenLDAP does not terminate this TLS itself in the bundled curl revision. lib/openldap.c drives curl's own SSL connection filter in oldap_ssl_connect() and then installs a Sockbuf_IO layer that routes OpenLDAP's BER reads and writes through conn->recv/conn->send. The socketpair therefore carries ordinary TLS records, and a plain server-side OpenSSL acceptor can terminate them even though libldap itself was configured –without-tls.

LDAP handshakes carry no ALPN extension. The carrier is constructed with its closed HTTP/1.1 default, but OpenSSL only invokes the selector when the client offers ALPN, so curl negotiates no application protocol here.

Definition at line 43 of file ldaps_mock_server.h.

Constructor & Destructor Documentation

◆ LdapsMockServer()

proto_fuzzer::LdapsMockServer::LdapsMockServer ( )

Construct the OpenSSL server carrier used by every LDAPS scenario.

LDAP sends no ALPN extension, so the closed HTTP/1.1 default is never selected and the handshake completes without an application protocol.

Definition at line 23 of file ldaps_mock_server.cc.

◆ ~LdapsMockServer()

proto_fuzzer::LdapsMockServer::~LdapsMockServer ( )
override

Release the TLS connection before the carrier-owned server context.

The inherited BER parser holds no transport state of its own.

Definition at line 27 of file ldaps_mock_server.cc.

Member Function Documentation

◆ completed_handshake_count()

std::size_t proto_fuzzer::LdapsMockServer::completed_handshake_count ( ) const
Returns
Number of connections that completed TLS negotiation.

Definition at line 48 of file ldaps_mock_server.cc.

◆ CreateConnection()

std::unique_ptr< MockConnection > proto_fuzzer::LdapsMockServer::CreateConnection ( )
overrideprotectedvirtual

Wrap one socketpair endpoint in an OpenSSL acceptor.

The inherited BER loop advances the handshake and then parses only decrypted LDAPMessages.

Returns
Newly allocated nonblocking TLS connection.

Reimplemented from proto_fuzzer::LdapMockServer.

Definition at line 42 of file ldaps_mock_server.cc.

◆ Install()

void proto_fuzzer::LdapsMockServer::Install ( CURL * easy)
overridevirtual

Install the shared socket callbacks and a stable local trust anchor.

Curl copies the blob descriptor during setopt and borrows the inline certificate bytes, whose program lifetime safely exceeds every easy handle. Scenario options run afterwards and can still disable verification.

Parameters
easyEasy handle that will initiate the LDAPS exchange.

Reimplemented from proto_fuzzer::MockServerBase.

Definition at line 34 of file ldaps_mock_server.cc.

◆ negotiated_alpn()

std::string proto_fuzzer::LdapsMockServer::negotiated_alpn ( ) const
Returns
ALPN protocol selected by curl, or an empty string when absent.

Definition at line 51 of file ldaps_mock_server.cc.

◆ negotiated_tls_version()

int proto_fuzzer::LdapsMockServer::negotiated_tls_version ( ) const
Returns
Protocol version selected by the most recent handshake, or zero.

Definition at line 45 of file ldaps_mock_server.cc.


The documentation for this class was generated from the following files: