diff --git a/src/server/pva/server.h b/src/server/pva/server.h index 3bd2196..0ac6724 100644 --- a/src/server/pva/server.h +++ b/src/server/pva/server.h @@ -17,6 +17,7 @@ namespace epics{namespace pvAccess{ class ChannelProvider; class Channel; class ChannelRequester; +struct PeerInfo; // see pv/security.h }} // epics::pvAccess //! See @ref pvas API @@ -168,7 +169,10 @@ public: friend struct Impl; bool isclaimed; std::string cname; - Search(const std::string& name) :isclaimed(false),cname(name) {} + const ::epics::pvAccess::PeerInfo* peerinfo; + Search(const std::string& name, const ::epics::pvAccess::PeerInfo* peer) + :isclaimed(false),cname(name),peerinfo(peer) + {} public: //! The name being queried const std::string& name() const { return cname; } @@ -176,6 +180,10 @@ public: bool claimed() const { return isclaimed; } //! Has been claimed() void claim() { isclaimed = true; } + //! Information about peer making search request. + //! May be NULL if not information is available. + //! @since >7.1.0 + const ::epics::pvAccess::PeerInfo* peer() const { return peerinfo; } }; typedef std::vector search_type; diff --git a/src/server/pva/sharedstate.h b/src/server/pva/sharedstate.h index aadc245..c6be107 100644 --- a/src/server/pva/sharedstate.h +++ b/src/server/pva/sharedstate.h @@ -242,6 +242,10 @@ public: //! The name of the channel through which this request was made (eg. for logging purposes). std::string channelName() const; + //! Information about peer transport and authentication. + //! @returns May be NULL if no information is available + const epics::pvAccess::PeerInfo* peer() const; + void complete(); //!< shorthand for successful completion w/o data (Put or RPC with void return) //! Complete with success or error w/o data. void complete(const epics::pvData::Status& sts); diff --git a/src/server/server.cpp b/src/server/server.cpp index 7e64650..f9ff685 100644 --- a/src/server/server.cpp +++ b/src/server/server.cpp @@ -17,6 +17,7 @@ #define epicsExportSharedSymbols #include "pva/server.h" #include "pv/pvAccess.h" +#include "pv/security.h" #include "pv/reftrack.h" namespace pvd = epics::pvData; @@ -216,8 +217,9 @@ struct DynamicProvider::Impl : public pva::ChannelProvider { bool found = false; { + pva::PeerInfo::const_shared_pointer info(requester->getPeerInfo()); search_type search; - search.push_back(DynamicProvider::Search(name)); + search.push_back(DynamicProvider::Search(name, info ? info.get() : 0)); handler->hasChannels(search); diff --git a/src/server/sharedstate_channel.cpp b/src/server/sharedstate_channel.cpp index a972064..c76ba32 100644 --- a/src/server/sharedstate_channel.cpp +++ b/src/server/sharedstate_channel.cpp @@ -300,6 +300,11 @@ std::string Operation::channelName() const return ret; } +const pva::PeerInfo* Operation::peer() const +{ + return impl->info ? impl->info.get() : 0; +} + void Operation::complete() { impl->complete(pvd::Status(), 0); diff --git a/src/server/sharedstate_put.cpp b/src/server/sharedstate_put.cpp index 04d0cbc..b4117a0 100644 --- a/src/server/sharedstate_put.cpp +++ b/src/server/sharedstate_put.cpp @@ -34,7 +34,11 @@ struct PutOP : public pvas::Operation::Impl const pvd::BitSet& changed) :Impl(pvRequest, value, changed) ,op(op) - {} + { + pva::ChannelRequester::shared_pointer req(op->channel->getChannelRequester()); + if(req) + info = req->getPeerInfo(); + } virtual ~PutOP() {} virtual pva::Channel::shared_pointer getChannel() OVERRIDE FINAL diff --git a/src/server/sharedstate_rpc.cpp b/src/server/sharedstate_rpc.cpp index 4a8eca5..0d584d0 100644 --- a/src/server/sharedstate_rpc.cpp +++ b/src/server/sharedstate_rpc.cpp @@ -32,7 +32,11 @@ struct RPCOP : public pvas::Operation::Impl const pvd::PVStructure::const_shared_pointer& value) :Impl(pvRequest, value, pvd::BitSet().set(0)) ,op(op) - {} + { + pva::ChannelRequester::shared_pointer req(op->channel->getChannelRequester()); + if(req) + info = req->getPeerInfo(); + } virtual ~RPCOP() {} virtual pva::Channel::shared_pointer getChannel() OVERRIDE FINAL diff --git a/src/server/sharedstateimpl.h b/src/server/sharedstateimpl.h index ed67724..853c8d9 100644 --- a/src/server/sharedstateimpl.h +++ b/src/server/sharedstateimpl.h @@ -9,6 +9,7 @@ #include "pva/sharedstate.h" #include +#include #include #define FOR_EACH(TYPE, IT, END, OBJ) for(TYPE IT((OBJ).begin()), END((OBJ).end()); IT != END; ++IT) @@ -135,6 +136,8 @@ struct Operation::Impl const pvd::PVStructure::const_shared_pointer pvRequest, value; const pvd::BitSet changed; + //! const after sub-class ctor + pva::PeerInfo::const_shared_pointer info; bool done; int debugLvl;