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.
This commit is contained in:
Michael Davidsaver
2017-11-05 16:41:59 -06:00
parent 47332fdf90
commit 5e900b1f11
7 changed files with 24 additions and 36 deletions

View File

@@ -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<InitData*>(arg);
// check if plug-in name is valid
SecurityPlugin::shared_pointer securityPlugin;
map<string, SecurityPlugin::shared_pointer>::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<SecurityPluginControl>(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<std::string>& offeredSecurityPlugins)
{
vector<string>* offeredSecurityPlugins = static_cast< vector<string>* >(arg);
if (!offeredSecurityPlugins->empty())
if (!offeredSecurityPlugins.empty())
{
map<string, SecurityPlugin::shared_pointer>& availableSecurityPlugins =
_context->getSecurityPlugins();
for (vector<string>::const_iterator offeredSP = offeredSecurityPlugins->begin();
offeredSP != offeredSecurityPlugins->end(); offeredSP++)
for (vector<string>::const_iterator offeredSP = offeredSecurityPlugins.begin();
offeredSP != offeredSecurityPlugins.end(); offeredSP++)
{
map<string, SecurityPlugin::shared_pointer>::iterator spi = availableSecurityPlugins.find(*offeredSP);
if (spi != availableSecurityPlugins.end())

View File

@@ -140,10 +140,6 @@ public:
// noop
}
virtual void authNZInitialize(void*) {
// noop
}
virtual void authNZMessage(epics::pvData::PVField::shared_pointer const & data) {
// noop
}

View File

@@ -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<std::string>& offeredSecurityPlugins);
virtual void authenticationCompleted(epics::pvData::Status const & status) OVERRIDE FINAL;

View File

@@ -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 <code>null</code>.

View File

@@ -25,6 +25,7 @@
#include <pv/inetAddressUtil.h>
#include <pv/hexDump.h>
#include <pv/remote.h>
#include <pv/codec.h>
#include <pv/channelSearchManager.h>
#include <pv/serializationHelper.h>
#include <pv/simpleChannelSearchManagerImpl.h>
@@ -2834,7 +2835,11 @@ public:
SerializeHelper::deserializeString(payloadBuffer, transport.get())
);
transport->authNZInitialize(&offeredSecurityPlugins);
epics::pvAccess::detail::BlockingClientTCPTransportCodec* cliTransport(static_cast<epics::pvAccess::detail::BlockingClientTCPTransportCodec*>(transport.get()));
//TODO: simplify byzantine class heirarchy...
assert(cliTransport);
cliTransport->authNZInitialize(offeredSecurityPlugins);
}
};

View File

@@ -38,6 +38,7 @@
#include <pv/serializationHelper.h>
#include <pv/logger.h>
#include <pv/pvAccessMB.h>
#include <pv/codec.h>
#include <pv/rpcServer.h>
#include <pv/securityImpl.h>
@@ -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<detail::BlockingServerTCPTransportCodec*>(transport.get()));
//TODO: simplify byzantine class heirarchy...
assert(casTransport);
transport->authNZInitialize(&initData);
casTransport->authNZInitialize(securityPluginName, data);
}

View File

@@ -399,7 +399,6 @@ public:
void aliveNotification() {}
void authNZMessage(epics::pvData::PVField::shared_pointer const & data) {}
void authNZInitialize(void*) {}
virtual std::tr1::shared_ptr<SecuritySession> getSecuritySession() const
{