Commit fbf8bdb2 authored by Marco De Marco's avatar Marco De Marco
Browse files

SSLClient partially implemented, common code moved on base class

parent b75ce3e2
Loading
Loading
Loading
Loading
+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
@@ -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;

@@ -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()
//==============================================================================
+10 −0
Original line number Diff line number Diff line
@@ -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);
@@ -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;
+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
@@ -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;
}
@@ -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()
//==============================================================================
+0 −5
Original line number Diff line number Diff line
@@ -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&,
+99 −16
Original line number Diff line number Diff line
#include <SSLClient.h>

#include <boost/filesystem.hpp>

namespace MetadataImporter_ns
{

@@ -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));
}

//==============================================================================
@@ -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);
}

//==============================================================================
@@ -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);
    }
}

//==============================================================================
@@ -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