From bcdf743ae9314bedb4c3b901f711e6c97656776a Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Mon, 9 Mar 2020 14:45:28 -0700 Subject: [PATCH] server expose raw client credentials --- src/pvxs/srvcommon.h | 4 +++- src/serverchan.cpp | 13 +++++++++++++ src/serverconn.h | 2 ++ src/serverget.cpp | 28 ++++++++++++++++++++++++++++ src/serverintrospect.cpp | 14 ++++++++++++++ src/servermon.cpp | 28 ++++++++++++++++++++++++++++ 6 files changed, 88 insertions(+), 1 deletion(-) diff --git a/src/pvxs/srvcommon.h b/src/pvxs/srvcommon.h index bfccce2..db42400 100644 --- a/src/pvxs/srvcommon.h +++ b/src/pvxs/srvcommon.h @@ -36,9 +36,11 @@ public: //! The Channel name const std::string& name() const { return _name; } op_t op() const { return _op; } - // TODO credentials virtual ~OpBase() =0; + + //! Return authentication method name (eg. "ca") and raw client credentials + virtual std::pair rawCredentials() const=0; }; //! Handle when an operation is being executed diff --git a/src/serverchan.cpp b/src/serverchan.cpp index 46d7659..0dc0b2c 100644 --- a/src/serverchan.cpp +++ b/src/serverchan.cpp @@ -166,6 +166,19 @@ void ServerChannelControl::close() }); } +std::pair ServerChannelControl::rawCredentials() const +{ + std::pair ret; + auto serv = server.lock(); + if(serv) + serv->acceptor_loop.call([this, &ret](){ + if(auto chan = this->chan.lock()) + if(auto conn = chan->conn.lock()) + ret = std::make_pair(conn->autoMethod, conn->credentials.clone()); + }); + return ret; +} + void ServerConn::handle_SEARCH() { EvInBuf M(peerBE, segBuf.get(), 16); diff --git a/src/serverconn.h b/src/serverconn.h index 2b485e7..52fa972 100644 --- a/src/serverconn.h +++ b/src/serverconn.h @@ -65,6 +65,8 @@ struct ServerChannelControl : public server::ChannelControl virtual void onClose(std::function&& fn) override final; virtual void close() override final; + virtual std::pair rawCredentials() const override final; + const std::weak_ptr server; const std::weak_ptr chan; }; diff --git a/src/serverget.cpp b/src/serverget.cpp index 3fe5144..06e149d 100644 --- a/src/serverget.cpp +++ b/src/serverget.cpp @@ -230,6 +230,20 @@ struct ServerGPRConnect : public server::ConnectOp }); } + virtual std::pair rawCredentials() const override final + { + std::pair ret; + auto serv = server.lock(); + if(serv) + serv->acceptor_loop.call([this, &ret](){ + if(auto oper = op.lock()) + if(auto chan = oper->chan.lock()) + if(auto conn = chan->conn.lock()) + ret = std::make_pair(conn->autoMethod, conn->credentials.clone()); + }); + return ret; + } + const std::weak_ptr server; const std::weak_ptr op; }; @@ -293,6 +307,20 @@ struct ServerGPRExec : public server::ExecOp }); } + virtual std::pair rawCredentials() const override final + { + std::pair ret; + auto serv = server.lock(); + if(serv) + serv->acceptor_loop.call([this, &ret](){ + if(auto oper = op.lock()) + if(auto chan = oper->chan.lock()) + if(auto conn = chan->conn.lock()) + ret = std::make_pair(conn->autoMethod, conn->credentials.clone()); + }); + return ret; + } + const std::weak_ptr server; const std::weak_ptr op; }; diff --git a/src/serverintrospect.cpp b/src/serverintrospect.cpp index 6699e10..6b79e49 100644 --- a/src/serverintrospect.cpp +++ b/src/serverintrospect.cpp @@ -105,6 +105,20 @@ struct ServerIntrospectControl : public server::ConnectOp }); } + virtual std::pair rawCredentials() const override final + { + std::pair ret; + auto serv = server.lock(); + if(serv) + serv->acceptor_loop.call([this, &ret](){ + if(auto oper = op.lock()) + if(auto chan = oper->chan.lock()) + if(auto conn = chan->conn.lock()) + ret = std::make_pair(conn->autoMethod, conn->credentials.clone()); + }); + return ret; + } + // we'll never use these, so no reason to store virtual void onGet(std::function&& fn)>&& fn) override final {} virtual void onPut(std::function&& fn, Value&&)>&& fn) override final {} diff --git a/src/servermon.cpp b/src/servermon.cpp index 9d5634a..8d3466c 100644 --- a/src/servermon.cpp +++ b/src/servermon.cpp @@ -303,6 +303,20 @@ struct ServerMonitorControl : public server::MonitorControlOp }); } + virtual std::pair rawCredentials() const override final + { + std::pair ret; + auto serv = server.lock(); + if(serv) + serv->acceptor_loop.call([this, &ret](){ + if(auto oper = op.lock()) + if(auto chan = oper->chan.lock()) + if(auto conn = chan->conn.lock()) + ret = std::make_pair(conn->autoMethod, conn->credentials.clone()); + }); + return ret; + } + const std::weak_ptr server; const std::weak_ptr op; }; @@ -381,6 +395,20 @@ struct ServerMonitorSetup : public server::MonitorSetupOp }); } + virtual std::pair rawCredentials() const override final + { + std::pair ret; + auto serv = server.lock(); + if(serv) + serv->acceptor_loop.call([this, &ret](){ + if(auto oper = op.lock()) + if(auto chan = oper->chan.lock()) + if(auto conn = chan->conn.lock()) + ret = std::make_pair(conn->autoMethod, conn->credentials.clone()); + }); + return ret; + } + const std::weak_ptr server; const std::weak_ptr op; };