Skip to content

Commit a5ff6ec

Browse files
committed
fixup! Support TLS listeners
1 parent cb68f2a commit a5ff6ec

8 files changed

+625
-291
lines changed

src/applications/bmqbrkr/etc/bmqbrkrcfg.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
"rotationBytes": 268435456,
99
"logfileFormat": "%d (%t) %s %F:%l %m\n\n",
1010
"consoleFormat": "%d (%t) %s %F:%l %m\n",
11-
"loggingVerbosity": "TRACE",
12-
"consoleSeverityThreshold": "TRACE",
11+
"loggingVerbosity": "INFO",
12+
"consoleSeverityThreshold": "INFO",
1313
"categories": [
1414
"BMQBRKR:INFO:green",
1515
"BMQ*:INFO:green",

src/groups/bmq/bmqio/bmqio_ntcchannel.cpp

+11-32
Original file line numberDiff line numberDiff line change
@@ -557,12 +557,6 @@ void NtcChannel::processConnect(
557557

558558
d_peerUri = d_streamSocket_sp->remoteEndpoint().text();
559559

560-
if (d_encryptionClient_sp) {
561-
this->upgrade(d_encryptionClient_sp,
562-
ntca::UpgradeOptions(),
563-
d_upgradeCallback);
564-
}
565-
566560
lock.release()->unlock();
567561

568562
if (resultCallback) {
@@ -977,32 +971,7 @@ NtcChannel::NtcChannel(
977971
, d_watermarkSignaler(basicAllocator)
978972
, d_closeSignaler(basicAllocator)
979973
, d_resultCallback(bsl::allocator_arg, basicAllocator, resultCallback)
980-
, d_encryptionClient_sp()
981-
, d_upgradeCallback(bsl::allocator_arg, basicAllocator)
982-
, d_allocator_p(bslma::Default::allocator(basicAllocator))
983-
{
984-
}
985-
986-
NtcChannel::NtcChannel(
987-
const bsl::shared_ptr<ntci::Interface>& interface,
988-
const bmqio::ChannelFactory::ResultCallback& resultCallback,
989-
const ntci::UpgradeFunction& upgradeCallback,
990-
bslma::Allocator* basicAllocator)
991-
: d_mutex()
992-
, d_interface_sp(interface)
993-
, d_streamSocket_sp()
994-
, d_readQueue(basicAllocator)
995-
, d_readCache(basicAllocator)
996-
, d_channelId(0)
997-
, d_peerUri(basicAllocator)
998-
, d_state(e_STATE_DEFAULT)
999-
, d_options(basicAllocator)
1000-
, d_properties(basicAllocator)
1001-
, d_watermarkSignaler(basicAllocator)
1002-
, d_closeSignaler(basicAllocator)
1003-
, d_resultCallback(bsl::allocator_arg, basicAllocator, resultCallback)
1004-
, d_encryptionClient_sp()
1005-
, d_upgradeCallback(bsl::allocator_arg, basicAllocator, upgradeCallback)
974+
, d_upgradable()
1006975
, d_allocator_p(bslma::Default::allocator(basicAllocator))
1007976
{
1008977
}
@@ -1961,5 +1930,15 @@ void NtcListenerUtil::fail(Status* status,
19611930
}
19621931
}
19631932

1933+
const bsl::shared_ptr<ntci::Upgradable>& NtcChannel::upgradable() const
1934+
{
1935+
return d_upgradable;
1936+
}
1937+
1938+
bsl::shared_ptr<ntci::Upgradable>& NtcChannel::upgradable()
1939+
{
1940+
return d_upgradable;
1941+
}
1942+
19641943
} // close package namespace
19651944
} // close enterprise namespace

src/groups/bmq/bmqio/bmqio_ntcchannel.h

+19-22
Original file line numberDiff line numberDiff line change
@@ -215,9 +215,8 @@ class NtcChannel : public bmqio::Channel,
215215
bdlmt::Signaler<WatermarkFnType> d_watermarkSignaler;
216216
bdlmt::Signaler<CloseFnType> d_closeSignaler;
217217
bmqio::ChannelFactory::ResultCallback d_resultCallback;
218-
bsl::shared_ptr<ntci::EncryptionClient> d_encryptionClient_sp;
219-
ntci::UpgradeFunction d_upgradeCallback;
220-
bslma::Allocator* d_allocator_p;
218+
bsl::shared_ptr<ntci::Upgradable> d_upgradable;
219+
bslma::Allocator* d_allocator_p;
221220

222221
private:
223222
// NOT IMPLEMENTED
@@ -312,16 +311,6 @@ class NtcChannel : public bmqio::Channel,
312311
const bmqio::ChannelFactory::ResultCallback& resultCallback,
313312
bslma::Allocator* basicAllocator = 0);
314313

315-
/// Create a new channel implemented by the specified `interface`.
316-
/// Optionally specify a `basicAllocator` used to supply memory. Initialize
317-
/// this channel's upgrade callback with `upgradeCallback`. If
318-
/// 'basicAllocator is 0, the currently installed default allocator is
319-
/// used.
320-
NtcChannel(const bsl::shared_ptr<ntci::Interface>& interface,
321-
const bmqio::ChannelFactory::ResultCallback& resultCallback,
322-
const ntci::UpgradeFunction& upgradeCallback,
323-
bslma::Allocator* basicAllocator = 0);
324-
325314
/// Destroy this object.
326315
~NtcChannel() BSLS_KEYWORD_OVERRIDE;
327316

@@ -431,6 +420,9 @@ class NtcChannel : public bmqio::Channel,
431420
/// Set the write queue high watermark to the specified `highWatermark`.
432421
void setWriteQueueHighWatermark(int highWatermark);
433422

423+
/// Set the upgradable handle if this channel has been upgraded.
424+
void setUpgradable(const bsl::shared_ptr<ntci::Upgradable>& upgradable);
425+
434426
/// Assume the TLS server role and begin upgrading the socket from
435427
/// being unencrypted to being encrypted with TLS. Invoke the specified
436428
/// `upgradeCallback` when the socket has completed upgrading to TLS.
@@ -472,6 +464,11 @@ class NtcChannel : public bmqio::Channel,
472464
/// Return the socket interface for this channel. This function is
473465
/// undefined unless the channel has succesfully established a connection.
474466
const ntci::StreamSocket& streamSocket() const;
467+
468+
/// Return the upgradable handle for the channel.
469+
const bsl::shared_ptr<ntci::Upgradable>& upgradable() const;
470+
471+
bsl::shared_ptr<ntci::Upgradable>& upgradable();
475472
};
476473

477474
// =====================
@@ -529,15 +526,15 @@ class NtcListener : public bmqio::ChannelFactoryOperationHandle,
529526
};
530527

531528
// INSTANCE DATA
532-
bslmt::Mutex d_mutex;
533-
bsl::shared_ptr<ntci::Interface> d_interface_sp;
534-
bsl::shared_ptr<ntci::ListenerSocket> d_listenerSocket_sp;
535-
bsl::string d_localUri;
536-
State d_state;
537-
bmqio::ListenOptions d_options;
538-
bmqvt::PropertyBag d_properties;
539-
bdlmt::Signaler<CloseFnType> d_closeSignaler;
540-
bmqio::ChannelFactory::ResultCallback d_resultCallback;
529+
bslmt::Mutex d_mutex;
530+
bsl::shared_ptr<ntci::Interface> d_interface_sp;
531+
bsl::shared_ptr<ntci::ListenerSocket> d_listenerSocket_sp;
532+
bsl::string d_localUri;
533+
State d_state;
534+
bmqio::ListenOptions d_options;
535+
bmqvt::PropertyBag d_properties;
536+
bdlmt::Signaler<CloseFnType> d_closeSignaler;
537+
bmqio::ChannelFactory::ResultCallback d_resultCallback;
541538
bsl::shared_ptr<ntci::EncryptionServer> d_encryptionServer_sp;
542539
ntci::UpgradeFunction d_upgradeCallback;
543540
bslma::Allocator* d_allocator_p;

src/groups/bmq/bmqio/bmqio_ntcchannelfactory.cpp

+65-17
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,23 @@ void NtcChannelFactory::processListenerResult(
110110
<< AddressFormatter(alias.get()) << " to "
111111
<< alias->peerUri() << " registered"
112112
<< BALL_LOG_END;
113+
114+
// Check if we need to upgrade the connection to TLS
115+
if (d_encryptionServer) {
116+
alias->upgrade(d_encryptionServer,
117+
ntca::UpgradeOptions(),
118+
bdlf::BindUtil::bindS(
119+
d_allocator_p,
120+
&NtcChannelFactory::processUpgrade,
121+
this,
122+
event,
123+
status,
124+
channel,
125+
bdlf::PlaceHolders::_1,
126+
bdlf::PlaceHolders::_2,
127+
callback));
128+
return; // RETURN
129+
}
113130
}
114131
}
115132
}
@@ -145,6 +162,7 @@ void NtcChannelFactory::processChannelResult(
145162
const bsl::shared_ptr<bmqio::Channel>& channel,
146163
const bmqio::ChannelFactory::ResultCallback& callback)
147164
{
165+
// Result callback for connect
148166
BALL_LOG_TRACE << "NTC factory event " << event << " status " << status
149167
<< BALL_LOG_END;
150168

@@ -155,6 +173,23 @@ void NtcChannelFactory::processChannelResult(
155173
if (alias) {
156174
d_createSignaler(alias, alias);
157175
}
176+
177+
// Check if we need to upgrade the connection to TLS
178+
if (d_encryptionClient) {
179+
alias->upgrade(
180+
d_encryptionClient,
181+
ntca::UpgradeOptions(),
182+
bdlf::BindUtil::bindS(d_allocator_p,
183+
&NtcChannelFactory::processUpgrade,
184+
this,
185+
event,
186+
status,
187+
channel,
188+
bdlf::PlaceHolders::_1,
189+
bdlf::PlaceHolders::_2,
190+
callback));
191+
return; // RETURN
192+
}
158193
}
159194
}
160195

@@ -184,12 +219,25 @@ void NtcChannelFactory::processChannelClosed(int handle)
184219
}
185220

186221
void NtcChannelFactory::processUpgrade(
187-
const bsl::shared_ptr<ntci::Upgradable>& upgradable,
188-
const ntca::UpgradeEvent& event,
189-
const UpgradeCallback& onUpgrade)
222+
bmqio::ChannelFactoryEvent::Enum event,
223+
const bmqio::Status& status,
224+
const bsl::shared_ptr<bmqio::NtcChannel>& channel,
225+
const bsl::shared_ptr<ntci::Upgradable>& upgradable,
226+
const ntca::UpgradeEvent& upgradeEvent,
227+
const bmqio::ChannelFactory::ResultCallback& callback)
190228
{
191-
bslmt::LockGuard<bslmt::Mutex> lock(&d_stateMutex); // LOCKED
192-
onUpgrade(upgradable, event);
229+
if (upgradeEvent.isError()) {
230+
BALL_LOG_ERROR << "Received error during TLS negotiation: " << event;
231+
bmqio::Status st(bmqio::StatusCategory::e_GENERIC_ERROR,
232+
d_allocator_p);
233+
channel->close(st);
234+
callback(ChannelFactoryEvent::e_CONNECT_FAILED, st, channel);
235+
return; // RETURN
236+
}
237+
238+
channel->setUpgradable(upgradable);
239+
240+
callback(event, status, channel);
193241
}
194242

195243
// CREATORS
@@ -206,6 +254,8 @@ NtcChannelFactory::NtcChannelFactory(
206254
, d_stateMutex()
207255
, d_stateCondition()
208256
, d_state(e_STATE_DEFAULT)
257+
, d_encryptionServer()
258+
, d_encryptionClient()
209259
, d_allocator_p(bslma::Default::allocator(basicAllocator))
210260
{
211261
}
@@ -223,6 +273,8 @@ NtcChannelFactory::NtcChannelFactory(
223273
, d_stateMutex()
224274
, d_stateCondition()
225275
, d_state(e_STATE_DEFAULT)
276+
, d_encryptionServer()
277+
, d_encryptionClient()
226278
, d_allocator_p(bslma::Default::allocator(basicAllocator))
227279
{
228280
bsl::shared_ptr<bdlbb::BlobBufferFactory> blobBufferFactory_sp(
@@ -469,22 +521,18 @@ int NtcChannelFactory::lookupChannel(
469521
return d_channels.find(channelId, result);
470522
}
471523

472-
ntsa::Error NtcChannelFactory::createEncryptionServer(
473-
bsl::shared_ptr<ntci::EncryptionServer>* result,
474-
const ntca::EncryptionServerOptions& options)
524+
NtcChannelFactory& NtcChannelFactory::setEncryptionServer(
525+
const bsl::shared_ptr<ntci::EncryptionServer>& encryptionServer)
475526
{
476-
return d_interface_sp->createEncryptionServer(result,
477-
options,
478-
d_allocator_p);
527+
d_encryptionServer = encryptionServer;
528+
return *this;
479529
}
480530

481-
ntsa::Error NtcChannelFactory::createEncryptionClient(
482-
bsl::shared_ptr<ntci::EncryptionClient>* result,
483-
const ntca::EncryptionClientOptions& options)
531+
NtcChannelFactory& NtcChannelFactory::setEncryptionClient(
532+
const bsl::shared_ptr<ntci::EncryptionClient>& encryptionClient)
484533
{
485-
return d_interface_sp->createEncryptionClient(result,
486-
options,
487-
d_allocator_p);
534+
d_encryptionClient = encryptionClient;
535+
return *this;
488536
}
489537

490538
NtcCertificateLoader NtcChannelFactory::createCertificateLoader()

src/groups/bmq/bmqio/bmqio_ntcchannelfactory.h

+22-25
Original file line numberDiff line numberDiff line change
@@ -110,16 +110,18 @@ class NtcChannelFactory : public bmqio::ChannelFactory {
110110
};
111111

112112
// INSTANCE DATA
113-
bsl::shared_ptr<ntci::Interface> d_interface_sp;
114-
ListenerCatalog d_listeners;
115-
ChannelCatalog d_channels;
116-
bdlmt::Signaler<CreateFnType> d_createSignaler;
117-
bdlmt::Signaler<LimitFnType> d_limitSignaler;
118-
bool d_owned;
119-
bslmt::Mutex d_stateMutex;
120-
bslmt::Condition d_stateCondition;
121-
State d_state;
122-
bslma::Allocator* d_allocator_p;
113+
bsl::shared_ptr<ntci::Interface> d_interface_sp;
114+
ListenerCatalog d_listeners;
115+
ChannelCatalog d_channels;
116+
bdlmt::Signaler<CreateFnType> d_createSignaler;
117+
bdlmt::Signaler<LimitFnType> d_limitSignaler;
118+
bool d_owned;
119+
bslmt::Mutex d_stateMutex;
120+
bslmt::Condition d_stateCondition;
121+
State d_state;
122+
bsl::shared_ptr<ntci::EncryptionServer> d_encryptionServer;
123+
bsl::shared_ptr<ntci::EncryptionClient> d_encryptionClient;
124+
bslma::Allocator* d_allocator_p;
123125

124126
private:
125127
// NOT IMPLEMENTED
@@ -155,15 +157,12 @@ class NtcChannelFactory : public bmqio::ChannelFactory {
155157
void processChannelClosed(int handle);
156158

157159
/// Process a TLS upgrade
158-
void processUpgrade(const bsl::shared_ptr<ntci::Upgradable>& upgradable,
159-
const ntca::UpgradeEvent& event,
160-
const UpgradeCallback& callback);
161-
162-
/// Upgrade the channel to a TLS connection as a listener.
163-
void upgradeListener(bmqio::NtcChannel* channel);
164-
165-
/// Upgrade the channel to a TLS connection as a client.
166-
void upgradeChannel(bmqio::NtcChannel* channel);
160+
void processUpgrade(bmqio::ChannelFactoryEvent::Enum event,
161+
const bmqio::Status& status,
162+
const bsl::shared_ptr<bmqio::NtcChannel>& channel,
163+
const bsl::shared_ptr<ntci::Upgradable>& upgradable,
164+
const ntca::UpgradeEvent& upgradeEvent,
165+
const bmqio::ChannelFactory::ResultCallback& callback);
167166

168167
public:
169168
// PUBLIC TYPES
@@ -267,19 +266,17 @@ class NtcChannelFactory : public bmqio::ChannelFactory {
267266
/// Load into the specified `result` a new encryption server with the
268267
/// specified `options`. Optionally specify a `basicAllocator` used to
269268
/// supply memory. Return the error.
270-
ntsa::Error
271-
createEncryptionServer(bsl::shared_ptr<ntci::EncryptionServer>* result,
272-
const ntca::EncryptionServerOptions& options);
269+
NtcChannelFactory& setEncryptionServer(
270+
const bsl::shared_ptr<ntci::EncryptionServer>& encryptionServer);
273271

274272
/// @brief Create an encryption server using this channel factory's
275273
/// interface.
276274
///
277275
/// Load into the specified `result` a new encryption client with the
278276
/// specified `options`. Optionally specify a `basicAllocator` used to
279277
/// supply memory. Return the error.
280-
ntsa::Error
281-
createEncryptionClient(bsl::shared_ptr<ntci::EncryptionClient>* result,
282-
const ntca::EncryptionClientOptions& options);
278+
NtcChannelFactory& setEncryptionClient(
279+
const bsl::shared_ptr<ntci::EncryptionClient>& encryptionServer);
283280

284281
/// @brief Create a certificate loader based on the underlying interface.
285282
NtcCertificateLoader createCertificateLoader();

src/groups/bmq/bmqio/bmqio_ntcchannelfactory.t.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ EncryptionPair makeEncryption(ntci::Interface* interface,
174174

175175
ntca::EncryptionServerOptions encryptionServerOptions;
176176
encryptionServerOptions.setMinMethod(ntca::EncryptionMethod::e_TLS_V1_3);
177-
encryptionServerOptions.setMaxMethod(ntca::EncryptionMethod::e_TLS_V1_3);
177+
encryptionServerOptions.setMaxMethod(ntca::EncryptionMethod::e_DEFAULT);
178178
encryptionServerOptions.setAuthentication(
179179
ntca::EncryptionAuthentication::e_NONE);
180180

@@ -203,7 +203,7 @@ EncryptionPair makeEncryption(ntci::Interface* interface,
203203

204204
ntca::EncryptionClientOptions encryptionClientOptions;
205205
encryptionClientOptions.setMinMethod(ntca::EncryptionMethod::e_TLS_V1_3);
206-
encryptionClientOptions.setMaxMethod(ntca::EncryptionMethod::e_TLS_V1_3);
206+
encryptionClientOptions.setMaxMethod(ntca::EncryptionMethod::e_DEFAULT);
207207
encryptionClientOptions.setAuthentication(
208208
ntca::EncryptionAuthentication::e_VERIFY);
209209

0 commit comments

Comments
 (0)