Loading src/Client.cpp +45 −1 Original line number Diff line number Diff line #include <Client.h> #include <boost/lexical_cast.hpp> #include <boost/bind.hpp> namespace MetadataImporter_ns Loading @@ -10,7 +11,9 @@ namespace MetadataImporter_ns //============================================================================== Client::Client(Tango::DeviceImpl* deviceImpl_p, Configuration::SP configuration_sp) : Tango::LogAdapter(deviceImpl_p), m_deviceImpl_p(deviceImpl_p), m_configuration_sp(configuration_sp), m_work(m_ioService), m_resolver(m_ioService) m_configuration_sp(configuration_sp), m_work(m_ioService), m_resolver(m_ioService), m_resetConnectionTimer(m_ioService), m_requestResponseTimer(m_ioService) { DEBUG_STREAM << "Client::Client()" << endl; Loading Loading @@ -125,6 +128,47 @@ void Client::run() } //while } //============================================================================== // Client::startResolve() //============================================================================== void Client::startResolve() { DEBUG_STREAM << "Client::startResolve()" << endl; //@warning: check lexical cast boost::asio::ip::tcp::resolver::query query(m_configuration_sp->getRemoteHost(), boost::lexical_cast<std::string>(m_configuration_sp->getRemotePort())); INFO_STREAM << "Client::startResolve() host: " << m_configuration_sp->getRemoteHost() << " port: " << m_configuration_sp->getRemotePort() << endl; m_resetConnectionTimer.expires_from_now(boost::posix_time::seconds(30)); m_resolver.async_resolve(query, boost::bind(&Client::handleResolve, this, boost::asio::placeholders::error, boost::asio::placeholders::iterator)); m_resetConnectionTimer.async_wait(boost::bind(&Client::resetConnection, this)); } //============================================================================== // Client::handleResolve() //============================================================================== void Client::handleResolve(const boost::system::error_code& errorCode, boost::asio::ip::tcp::resolver::iterator endPointIterator) { DEBUG_STREAM << "Client::handleResolve()" << endl; if(!errorCode) { startConnect(endPointIterator); } else { ERROR_STREAM << "Client::handleResolve() " << errorCode.message() << endl; } } //============================================================================== // Client::createAuthorisationRequest() //============================================================================== Loading src/Client.h +10 −0 Original line number Diff line number Diff line Loading @@ -63,6 +63,11 @@ protected: //------------------------------------------------------------------------------ virtual void run(); virtual void startResolve(); virtual void handleResolve(const boost::system::error_code&, boost::asio::ip::tcp::resolver::iterator); virtual RequestSP createAuthorisationRequest(); virtual void processAuthorisationResponse(ResponseSP); Loading @@ -80,6 +85,11 @@ protected: //------------------------------------------------------------------------------ // [Protected] Utilities abstract methods //------------------------------------------------------------------------------ virtual void startConnect(boost::asio::ip::tcp::resolver::iterator) = 0; virtual void handleConnect(const boost::system::error_code&, boost::asio::ip::tcp::resolver::iterator) = 0; virtual void startWriteRequest() = 0; virtual void handleWriteRequest(const boost::system::error_code&) = 0; Loading src/PlainClient.cpp +1 −44 Original line number Diff line number Diff line #include <PlainClient.h> #include <boost/lexical_cast.hpp> #include <boost/bind.hpp> namespace MetadataImporter_ns Loading @@ -11,8 +10,7 @@ namespace MetadataImporter_ns //============================================================================== PlainClient::PlainClient(Tango::DeviceImpl* deviceImpl_p, Configuration::SP configuration_sp) : Client(deviceImpl_p, configuration_sp), m_plainSocket(m_ioService), m_resetConnectionTimer(m_ioService), m_requestResponseTimer(m_ioService) m_plainSocket(m_ioService) { DEBUG_STREAM << "PlainClient::PlainClient()" << endl; } Loading Loading @@ -69,47 +67,6 @@ void PlainClient::stop() Client::stop(); } //============================================================================== // PlainClient::startResolve() //============================================================================== void PlainClient::startResolve() { DEBUG_STREAM << "PlainClient::startResolve()" << endl; //@warning: check lexical cast boost::asio::ip::tcp::resolver::query query(m_configuration_sp->getRemoteHost(), boost::lexical_cast<std::string>(m_configuration_sp->getRemotePort())); INFO_STREAM << "PlainClient::startResolve() host: " << m_configuration_sp->getRemoteHost() << " port: " << m_configuration_sp->getRemotePort() << endl; m_resetConnectionTimer.expires_from_now(boost::posix_time::seconds(30)); m_resolver.async_resolve(query, boost::bind(&PlainClient::handleResolve, this, boost::asio::placeholders::error, boost::asio::placeholders::iterator)); m_resetConnectionTimer.async_wait(boost::bind(&PlainClient::resetConnection, this)); } //============================================================================== // PlainClient::handleResolve() //============================================================================== void PlainClient::handleResolve(const boost::system::error_code& errorCode, boost::asio::ip::tcp::resolver::iterator endPointIterator) { DEBUG_STREAM << "PlainClient::handleResolve()" << endl; if(!errorCode) { startConnect(endPointIterator); } else { ERROR_STREAM << "PlainClient::handleResolve() " << errorCode.message() << endl; } } //============================================================================== // PlainClient::startConnect() //============================================================================== Loading src/PlainClient.h +0 −5 Original line number Diff line number Diff line Loading @@ -38,11 +38,6 @@ protected: //------------------------------------------------------------------------------ // [Protected] Utilities methods //------------------------------------------------------------------------------ virtual void startResolve(); virtual void handleResolve(const boost::system::error_code&, boost::asio::ip::tcp::resolver::iterator); virtual void startConnect(boost::asio::ip::tcp::resolver::iterator); virtual void handleConnect(const boost::system::error_code&, Loading src/SSLClient.cpp +99 −16 Original line number Diff line number Diff line #include <SSLClient.h> #include <boost/filesystem.hpp> namespace MetadataImporter_ns { Loading @@ -7,9 +9,27 @@ namespace MetadataImporter_ns // SSLClient::SSLClient() //============================================================================== SSLClient::SSLClient(Tango::DeviceImpl* deviceImpl_p, Configuration::SP configuration_sp) : Client(deviceImpl_p, configuration_sp) Configuration::SP configuration_sp) : Client(deviceImpl_p, configuration_sp), m_sSLContext(boost::asio::ssl::context::sslv23), m_sSLSocket(m_ioService, m_sSLContext) { DEBUG_STREAM << "SSLClient::SSLClient()" << endl; boost::system::error_code errorCode; m_sSLContext.load_verify_file(m_configuration_sp->getCertificateFile(), errorCode); if(errorCode) { stringstream error_stream; error_stream << "SSLClient::SSLClient() " << errorCode.message() << endl; throw std::runtime_error(error_stream.str()); } m_sSLSocket.set_verify_mode(boost::asio::ssl::verify_peer); //@fixme: bind does not work // m_sSLSocket.set_verify_callback( // boost::bind(&SSLClient::verifyCertificate, this, _1, _2)); } //============================================================================== Loading @@ -18,6 +38,14 @@ SSLClient::SSLClient(Tango::DeviceImpl* deviceImpl_p, SSLClient::~SSLClient() { DEBUG_STREAM << "SSLClient::~SSLClient()" << endl; boost::system::error_code errorCode; m_sSLSocket.shutdown(errorCode); m_sSLSocket.lowest_layer().shutdown( boost::asio::ip::tcp::socket::shutdown_both, errorCode); m_sSLSocket.lowest_layer().close(errorCode); } //============================================================================== Loading Loading @@ -52,41 +80,81 @@ void SSLClient::stop() { DEBUG_STREAM << "SSLClient::stop()" << endl; boost::system::error_code errorCode; m_sSLSocket.shutdown(errorCode); m_sSLSocket.lowest_layer().shutdown( boost::asio::ip::tcp::socket::shutdown_both, errorCode); m_sSLSocket.lowest_layer().close(errorCode); Client::stop(); } //============================================================================== // SSLClient::startResolve() // SSLClient::verifyCertificate() //============================================================================== void SSLClient::startResolve() bool SSLClient::verifyCertificate(bool preVerified, boost::asio::ssl::verify_context sSLContext) { DEBUG_STREAM << "SSLClient::startResolve()" << endl; } DEBUG_STREAM << "SSLClient::verifyCertificate()" << endl; //============================================================================== // SSLClient::handleResolve() //============================================================================== void SSLClient::handleResolve(const boost::system::error_code&, boost::asio::ip::tcp::resolver::iterator) { DEBUG_STREAM << "SSLClient::handleResolve()" << endl; char subject_name[256]; X509* cert = X509_STORE_CTX_get_current_cert(sSLContext.native_handle()); X509_NAME_oneline(X509_get_subject_name(cert), subject_name, 256); INFO_STREAM << "SSLClient::verifyCertificate() verifying " << subject_name << endl; return preVerified; } //============================================================================== // SSLClient::startConnect() //============================================================================== void SSLClient::startConnect(boost::asio::ip::tcp::resolver::iterator) void SSLClient::startConnect(boost::asio::ip::tcp::resolver::iterator endPointIterator) { DEBUG_STREAM << "SSLClient::startConnect()" << endl; m_resetConnectionTimer.expires_from_now(boost::posix_time::seconds(30)); if(endPointIterator != boost::asio::ip::tcp::resolver::iterator()) { INFO_STREAM << "SSLClient::startConnect() connecting to " << endPointIterator->endpoint() << endl; m_sSLSocket.lowest_layer().async_connect(endPointIterator->endpoint(), boost::bind(&SSLClient::handleConnect, this, boost::asio::placeholders::error, endPointIterator)); } else { ERROR_STREAM << "PlainClient::startConnect() no more endpoint" << endl; } } //============================================================================== // SSLClient::handleConnect() //============================================================================== void SSLClient::handleConnect(const boost::system::error_code&, boost::asio::ip::tcp::resolver::iterator) void SSLClient::handleConnect(const boost::system::error_code& errorCode, boost::asio::ip::tcp::resolver::iterator endPointIterator) { DEBUG_STREAM << "SSLClient::handleConnect()" << endl; if(!errorCode) { startHandShake(); } else { ERROR_STREAM << "PlainClient::handleConnect() " << errorCode.message() << endl; if(m_sSLSocket.lowest_layer().is_open()) m_sSLSocket.lowest_layer().close(); startConnect(++endPointIterator); } } //============================================================================== Loading @@ -95,14 +163,29 @@ void SSLClient::handleConnect(const boost::system::error_code&, void SSLClient::startHandShake() { DEBUG_STREAM << "SSLClient::startHandShake()" << endl; m_resetConnectionTimer.expires_from_now(boost::posix_time::seconds(30)); m_sSLSocket.async_handshake(boost::asio::ssl::stream_base::client, boost::bind(&SSLClient::handleHandShake, this, boost::asio::placeholders::error)); } //============================================================================== // SSLClient::handleHandShake() //============================================================================== void SSLClient::handleHandShake(const boost::system::error_code&) void SSLClient::handleHandShake(const boost::system::error_code& errorCode) { DEBUG_STREAM << "SSLClient::handleHandShake()" << endl; if(!errorCode) { startWriteRequest(); } else { ERROR_STREAM << "SSLClient::handleHandShake() " << errorCode.message() << endl; } } //============================================================================== Loading Loading
src/Client.cpp +45 −1 Original line number Diff line number Diff line #include <Client.h> #include <boost/lexical_cast.hpp> #include <boost/bind.hpp> namespace MetadataImporter_ns Loading @@ -10,7 +11,9 @@ namespace MetadataImporter_ns //============================================================================== Client::Client(Tango::DeviceImpl* deviceImpl_p, Configuration::SP configuration_sp) : Tango::LogAdapter(deviceImpl_p), m_deviceImpl_p(deviceImpl_p), m_configuration_sp(configuration_sp), m_work(m_ioService), m_resolver(m_ioService) m_configuration_sp(configuration_sp), m_work(m_ioService), m_resolver(m_ioService), m_resetConnectionTimer(m_ioService), m_requestResponseTimer(m_ioService) { DEBUG_STREAM << "Client::Client()" << endl; Loading Loading @@ -125,6 +128,47 @@ void Client::run() } //while } //============================================================================== // Client::startResolve() //============================================================================== void Client::startResolve() { DEBUG_STREAM << "Client::startResolve()" << endl; //@warning: check lexical cast boost::asio::ip::tcp::resolver::query query(m_configuration_sp->getRemoteHost(), boost::lexical_cast<std::string>(m_configuration_sp->getRemotePort())); INFO_STREAM << "Client::startResolve() host: " << m_configuration_sp->getRemoteHost() << " port: " << m_configuration_sp->getRemotePort() << endl; m_resetConnectionTimer.expires_from_now(boost::posix_time::seconds(30)); m_resolver.async_resolve(query, boost::bind(&Client::handleResolve, this, boost::asio::placeholders::error, boost::asio::placeholders::iterator)); m_resetConnectionTimer.async_wait(boost::bind(&Client::resetConnection, this)); } //============================================================================== // Client::handleResolve() //============================================================================== void Client::handleResolve(const boost::system::error_code& errorCode, boost::asio::ip::tcp::resolver::iterator endPointIterator) { DEBUG_STREAM << "Client::handleResolve()" << endl; if(!errorCode) { startConnect(endPointIterator); } else { ERROR_STREAM << "Client::handleResolve() " << errorCode.message() << endl; } } //============================================================================== // Client::createAuthorisationRequest() //============================================================================== Loading
src/Client.h +10 −0 Original line number Diff line number Diff line Loading @@ -63,6 +63,11 @@ protected: //------------------------------------------------------------------------------ virtual void run(); virtual void startResolve(); virtual void handleResolve(const boost::system::error_code&, boost::asio::ip::tcp::resolver::iterator); virtual RequestSP createAuthorisationRequest(); virtual void processAuthorisationResponse(ResponseSP); Loading @@ -80,6 +85,11 @@ protected: //------------------------------------------------------------------------------ // [Protected] Utilities abstract methods //------------------------------------------------------------------------------ virtual void startConnect(boost::asio::ip::tcp::resolver::iterator) = 0; virtual void handleConnect(const boost::system::error_code&, boost::asio::ip::tcp::resolver::iterator) = 0; virtual void startWriteRequest() = 0; virtual void handleWriteRequest(const boost::system::error_code&) = 0; Loading
src/PlainClient.cpp +1 −44 Original line number Diff line number Diff line #include <PlainClient.h> #include <boost/lexical_cast.hpp> #include <boost/bind.hpp> namespace MetadataImporter_ns Loading @@ -11,8 +10,7 @@ namespace MetadataImporter_ns //============================================================================== PlainClient::PlainClient(Tango::DeviceImpl* deviceImpl_p, Configuration::SP configuration_sp) : Client(deviceImpl_p, configuration_sp), m_plainSocket(m_ioService), m_resetConnectionTimer(m_ioService), m_requestResponseTimer(m_ioService) m_plainSocket(m_ioService) { DEBUG_STREAM << "PlainClient::PlainClient()" << endl; } Loading Loading @@ -69,47 +67,6 @@ void PlainClient::stop() Client::stop(); } //============================================================================== // PlainClient::startResolve() //============================================================================== void PlainClient::startResolve() { DEBUG_STREAM << "PlainClient::startResolve()" << endl; //@warning: check lexical cast boost::asio::ip::tcp::resolver::query query(m_configuration_sp->getRemoteHost(), boost::lexical_cast<std::string>(m_configuration_sp->getRemotePort())); INFO_STREAM << "PlainClient::startResolve() host: " << m_configuration_sp->getRemoteHost() << " port: " << m_configuration_sp->getRemotePort() << endl; m_resetConnectionTimer.expires_from_now(boost::posix_time::seconds(30)); m_resolver.async_resolve(query, boost::bind(&PlainClient::handleResolve, this, boost::asio::placeholders::error, boost::asio::placeholders::iterator)); m_resetConnectionTimer.async_wait(boost::bind(&PlainClient::resetConnection, this)); } //============================================================================== // PlainClient::handleResolve() //============================================================================== void PlainClient::handleResolve(const boost::system::error_code& errorCode, boost::asio::ip::tcp::resolver::iterator endPointIterator) { DEBUG_STREAM << "PlainClient::handleResolve()" << endl; if(!errorCode) { startConnect(endPointIterator); } else { ERROR_STREAM << "PlainClient::handleResolve() " << errorCode.message() << endl; } } //============================================================================== // PlainClient::startConnect() //============================================================================== Loading
src/PlainClient.h +0 −5 Original line number Diff line number Diff line Loading @@ -38,11 +38,6 @@ protected: //------------------------------------------------------------------------------ // [Protected] Utilities methods //------------------------------------------------------------------------------ virtual void startResolve(); virtual void handleResolve(const boost::system::error_code&, boost::asio::ip::tcp::resolver::iterator); virtual void startConnect(boost::asio::ip::tcp::resolver::iterator); virtual void handleConnect(const boost::system::error_code&, Loading
src/SSLClient.cpp +99 −16 Original line number Diff line number Diff line #include <SSLClient.h> #include <boost/filesystem.hpp> namespace MetadataImporter_ns { Loading @@ -7,9 +9,27 @@ namespace MetadataImporter_ns // SSLClient::SSLClient() //============================================================================== SSLClient::SSLClient(Tango::DeviceImpl* deviceImpl_p, Configuration::SP configuration_sp) : Client(deviceImpl_p, configuration_sp) Configuration::SP configuration_sp) : Client(deviceImpl_p, configuration_sp), m_sSLContext(boost::asio::ssl::context::sslv23), m_sSLSocket(m_ioService, m_sSLContext) { DEBUG_STREAM << "SSLClient::SSLClient()" << endl; boost::system::error_code errorCode; m_sSLContext.load_verify_file(m_configuration_sp->getCertificateFile(), errorCode); if(errorCode) { stringstream error_stream; error_stream << "SSLClient::SSLClient() " << errorCode.message() << endl; throw std::runtime_error(error_stream.str()); } m_sSLSocket.set_verify_mode(boost::asio::ssl::verify_peer); //@fixme: bind does not work // m_sSLSocket.set_verify_callback( // boost::bind(&SSLClient::verifyCertificate, this, _1, _2)); } //============================================================================== Loading @@ -18,6 +38,14 @@ SSLClient::SSLClient(Tango::DeviceImpl* deviceImpl_p, SSLClient::~SSLClient() { DEBUG_STREAM << "SSLClient::~SSLClient()" << endl; boost::system::error_code errorCode; m_sSLSocket.shutdown(errorCode); m_sSLSocket.lowest_layer().shutdown( boost::asio::ip::tcp::socket::shutdown_both, errorCode); m_sSLSocket.lowest_layer().close(errorCode); } //============================================================================== Loading Loading @@ -52,41 +80,81 @@ void SSLClient::stop() { DEBUG_STREAM << "SSLClient::stop()" << endl; boost::system::error_code errorCode; m_sSLSocket.shutdown(errorCode); m_sSLSocket.lowest_layer().shutdown( boost::asio::ip::tcp::socket::shutdown_both, errorCode); m_sSLSocket.lowest_layer().close(errorCode); Client::stop(); } //============================================================================== // SSLClient::startResolve() // SSLClient::verifyCertificate() //============================================================================== void SSLClient::startResolve() bool SSLClient::verifyCertificate(bool preVerified, boost::asio::ssl::verify_context sSLContext) { DEBUG_STREAM << "SSLClient::startResolve()" << endl; } DEBUG_STREAM << "SSLClient::verifyCertificate()" << endl; //============================================================================== // SSLClient::handleResolve() //============================================================================== void SSLClient::handleResolve(const boost::system::error_code&, boost::asio::ip::tcp::resolver::iterator) { DEBUG_STREAM << "SSLClient::handleResolve()" << endl; char subject_name[256]; X509* cert = X509_STORE_CTX_get_current_cert(sSLContext.native_handle()); X509_NAME_oneline(X509_get_subject_name(cert), subject_name, 256); INFO_STREAM << "SSLClient::verifyCertificate() verifying " << subject_name << endl; return preVerified; } //============================================================================== // SSLClient::startConnect() //============================================================================== void SSLClient::startConnect(boost::asio::ip::tcp::resolver::iterator) void SSLClient::startConnect(boost::asio::ip::tcp::resolver::iterator endPointIterator) { DEBUG_STREAM << "SSLClient::startConnect()" << endl; m_resetConnectionTimer.expires_from_now(boost::posix_time::seconds(30)); if(endPointIterator != boost::asio::ip::tcp::resolver::iterator()) { INFO_STREAM << "SSLClient::startConnect() connecting to " << endPointIterator->endpoint() << endl; m_sSLSocket.lowest_layer().async_connect(endPointIterator->endpoint(), boost::bind(&SSLClient::handleConnect, this, boost::asio::placeholders::error, endPointIterator)); } else { ERROR_STREAM << "PlainClient::startConnect() no more endpoint" << endl; } } //============================================================================== // SSLClient::handleConnect() //============================================================================== void SSLClient::handleConnect(const boost::system::error_code&, boost::asio::ip::tcp::resolver::iterator) void SSLClient::handleConnect(const boost::system::error_code& errorCode, boost::asio::ip::tcp::resolver::iterator endPointIterator) { DEBUG_STREAM << "SSLClient::handleConnect()" << endl; if(!errorCode) { startHandShake(); } else { ERROR_STREAM << "PlainClient::handleConnect() " << errorCode.message() << endl; if(m_sSLSocket.lowest_layer().is_open()) m_sSLSocket.lowest_layer().close(); startConnect(++endPointIterator); } } //============================================================================== Loading @@ -95,14 +163,29 @@ void SSLClient::handleConnect(const boost::system::error_code&, void SSLClient::startHandShake() { DEBUG_STREAM << "SSLClient::startHandShake()" << endl; m_resetConnectionTimer.expires_from_now(boost::posix_time::seconds(30)); m_sSLSocket.async_handshake(boost::asio::ssl::stream_base::client, boost::bind(&SSLClient::handleHandShake, this, boost::asio::placeholders::error)); } //============================================================================== // SSLClient::handleHandShake() //============================================================================== void SSLClient::handleHandShake(const boost::system::error_code&) void SSLClient::handleHandShake(const boost::system::error_code& errorCode) { DEBUG_STREAM << "SSLClient::handleHandShake()" << endl; if(!errorCode) { startWriteRequest(); } else { ERROR_STREAM << "SSLClient::handleHandShake() " << errorCode.message() << endl; } } //============================================================================== Loading