From 5e900b1f11e05d87ee9854d41eab8177a36a7a8c Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Sun, 5 Nov 2017 16:41:59 -0600 Subject: [PATCH] remove super abstract authNZInitialize(void*) with separate client and server calls. Still dynamic_cast ugliness as Transport and Codec hierarchies don't have a common root. --- src/remote/codec.cpp | 27 ++++++++++---------------- src/remote/pv/blockingUDP.h | 4 ---- src/remote/pv/codec.h | 5 +++-- src/remote/pv/remote.h | 6 ------ src/remoteClient/clientContextImpl.cpp | 7 ++++++- src/server/responseHandlers.cpp | 10 +++++----- testApp/remote/testCodec.cpp | 1 - 7 files changed, 24 insertions(+), 36 deletions(-) diff --git a/src/remote/codec.cpp b/src/remote/codec.cpp index 9d3afda..90c2d83 100644 --- a/src/remote/codec.cpp +++ b/src/remote/codec.cpp @@ -1597,20 +1597,14 @@ void BlockingServerTCPTransportCodec::authenticationCompleted(epics::pvData::Sta epics::pvData::Status BlockingServerTCPTransportCodec::invalidSecurityPluginNameStatus(Status::STATUSTYPE_ERROR, "invalid security plug-in name"); -void BlockingServerTCPTransportCodec::authNZInitialize(void *arg) +void BlockingServerTCPTransportCodec::authNZInitialize(const std::string& securityPluginName, + const epics::pvData::PVField::shared_pointer& data) { - struct InitData { - std::string securityPluginName; - PVField::shared_pointer data; - }; - - InitData* initData = static_cast(arg); - // check if plug-in name is valid SecurityPlugin::shared_pointer securityPlugin; map::iterator spIter = - _context->getSecurityPlugins().find(initData->securityPluginName); + _context->getSecurityPlugins().find(securityPluginName); if (spIter != _context->getSecurityPlugins().end()) securityPlugin = spIter->second; if (!securityPlugin) @@ -1638,7 +1632,7 @@ void BlockingServerTCPTransportCodec::authNZInitialize(void *arg) { char ipAddrStr[48]; ipAddrToDottedIP(&_socketAddress.ia, ipAddrStr, sizeof(ipAddrStr)); - LOG(logLevelDebug, "Accepted security plug-in '%s' for PVA client: %s.", initData->securityPluginName.c_str(), ipAddrStr); + LOG(logLevelDebug, "Accepted security plug-in '%s' for PVA client: %s.", securityPluginName.c_str(), ipAddrStr); } try @@ -1646,11 +1640,11 @@ void BlockingServerTCPTransportCodec::authNZInitialize(void *arg) // create session SecurityPluginControl::shared_pointer spc = std::tr1::dynamic_pointer_cast(shared_from_this()); // TODO sync - _securitySession = securityPlugin->createSession(_socketAddress, spc, initData->data); + _securitySession = securityPlugin->createSession(_socketAddress, spc, data); } catch (SecurityException &se) { if (IS_LOGGABLE(logLevelDebug)) { - LOG(logLevelDebug, "Security plug-in '%s' failed to create a session for PVA client: %s.", initData->securityPluginName.c_str(), _socketName.c_str()); + LOG(logLevelDebug, "Security plug-in '%s' failed to create a session for PVA client: %s.", securityPluginName.c_str(), _socketName.c_str()); } Status status(Status::STATUSTYPE_ERROR, se.what()); verified(status); @@ -1915,16 +1909,15 @@ void BlockingClientTCPTransportCodec::send(ByteBuffer* buffer, } -void BlockingClientTCPTransportCodec::authNZInitialize(void *arg) +void BlockingClientTCPTransportCodec::authNZInitialize(const std::vector& offeredSecurityPlugins) { - vector* offeredSecurityPlugins = static_cast< vector* >(arg); - if (!offeredSecurityPlugins->empty()) + if (!offeredSecurityPlugins.empty()) { map& availableSecurityPlugins = _context->getSecurityPlugins(); - for (vector::const_iterator offeredSP = offeredSecurityPlugins->begin(); - offeredSP != offeredSecurityPlugins->end(); offeredSP++) + for (vector::const_iterator offeredSP = offeredSecurityPlugins.begin(); + offeredSP != offeredSecurityPlugins.end(); offeredSP++) { map::iterator spi = availableSecurityPlugins.find(*offeredSP); if (spi != availableSecurityPlugins.end()) diff --git a/src/remote/pv/blockingUDP.h b/src/remote/pv/blockingUDP.h index a963676..9a92175 100644 --- a/src/remote/pv/blockingUDP.h +++ b/src/remote/pv/blockingUDP.h @@ -140,10 +140,6 @@ public: // noop } - virtual void authNZInitialize(void*) { - // noop - } - virtual void authNZMessage(epics::pvData::PVField::shared_pointer const & data) { // noop } diff --git a/src/remote/pv/codec.h b/src/remote/pv/codec.h index 2cb0345..37fab15 100644 --- a/src/remote/pv/codec.h +++ b/src/remote/pv/codec.h @@ -574,7 +574,8 @@ public: // noop on server-side } - virtual void authNZInitialize(void *) OVERRIDE FINAL; + void authNZInitialize(const std::string& securityPluginName, + const epics::pvData::PVField::shared_pointer& data); virtual void authenticationCompleted(epics::pvData::Status const & status) OVERRIDE FINAL; @@ -679,7 +680,7 @@ public: virtual void send(epics::pvData::ByteBuffer* buffer, TransportSendControl* control) OVERRIDE FINAL; - virtual void authNZInitialize(void *) OVERRIDE FINAL; + void authNZInitialize(const std::vector& offeredSecurityPlugins); virtual void authenticationCompleted(epics::pvData::Status const & status) OVERRIDE FINAL; diff --git a/src/remote/pv/remote.h b/src/remote/pv/remote.h index 1e3c253..561aae9 100644 --- a/src/remote/pv/remote.h +++ b/src/remote/pv/remote.h @@ -295,12 +295,6 @@ public: */ virtual bool isClosed() = 0; - /** - * Used to initialize authNZ (select security plug-in). - * @param data - */ - virtual void authNZInitialize(void*) = 0; - /** * Pass data to the active security plug-in session. * @param data the data (any data), can be null. diff --git a/src/remoteClient/clientContextImpl.cpp b/src/remoteClient/clientContextImpl.cpp index e917f47..ed51edb 100644 --- a/src/remoteClient/clientContextImpl.cpp +++ b/src/remoteClient/clientContextImpl.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -2834,7 +2835,11 @@ public: SerializeHelper::deserializeString(payloadBuffer, transport.get()) ); - transport->authNZInitialize(&offeredSecurityPlugins); + epics::pvAccess::detail::BlockingClientTCPTransportCodec* cliTransport(static_cast(transport.get())); + //TODO: simplify byzantine class heirarchy... + assert(cliTransport); + + cliTransport->authNZInitialize(offeredSecurityPlugins); } }; diff --git a/src/server/responseHandlers.cpp b/src/server/responseHandlers.cpp index 4a53222..12a4e58 100644 --- a/src/server/responseHandlers.cpp +++ b/src/server/responseHandlers.cpp @@ -38,6 +38,7 @@ #include #include #include +#include #include #include @@ -183,12 +184,11 @@ void ServerConnectionValidationHandler::handleResponse( if (payloadBuffer->getRemaining()) data = SerializationHelper::deserializeFull(payloadBuffer, transport.get()); - struct { - std::string securityPluginName; - PVField::shared_pointer data; - } initData = { securityPluginName, data }; + detail::BlockingServerTCPTransportCodec* casTransport(static_cast(transport.get())); + //TODO: simplify byzantine class heirarchy... + assert(casTransport); - transport->authNZInitialize(&initData); + casTransport->authNZInitialize(securityPluginName, data); } diff --git a/testApp/remote/testCodec.cpp b/testApp/remote/testCodec.cpp index 67baa74..74b4108 100644 --- a/testApp/remote/testCodec.cpp +++ b/testApp/remote/testCodec.cpp @@ -399,7 +399,6 @@ public: void aliveNotification() {} void authNZMessage(epics::pvData::PVField::shared_pointer const & data) {} - void authNZInitialize(void*) {} virtual std::tr1::shared_ptr getSecuritySession() const {