diff --git a/src/qamqp/amqp.cpp b/src/qamqp/amqp.cpp index ca105ec..4664f5e 100644 --- a/src/qamqp/amqp.cpp +++ b/src/qamqp/amqp.cpp @@ -98,8 +98,9 @@ void ClientPrivate::connect() void ClientPrivate::parseCnnString( const QUrl & con ) { P_Q(QAMQP::Client); - if(con.scheme() == AMQPSCHEME ) + if(con.scheme() == AMQPSCHEME || con.scheme() == AMQPSSCHEME ) { + q->setSsl(con.scheme() == AMQPSSCHEME); q->setPassword(con.password()); q->setUser(con.userName()); q->setPort(con.port()); @@ -154,6 +155,8 @@ void ClientPrivate::disconnect() } + + ////////////////////////////////////////////////////////////////////////// @@ -327,4 +330,14 @@ void QAMQP::Client::setAuth( Authenticator * auth ) Authenticator * QAMQP::Client::auth() const { return pd_func()->auth_.data(); +} + +bool QAMQP::Client::isSsl() const +{ + return pd_func()->network_->isSsl(); +} + +void QAMQP::Client::setSsl( bool value ) +{ + pd_func()->network_->setSsl(value); } \ No newline at end of file diff --git a/src/qamqp/amqp.h b/src/qamqp/amqp.h index b902b21..accc573 100644 --- a/src/qamqp/amqp.h +++ b/src/qamqp/amqp.h @@ -21,6 +21,7 @@ namespace QAMQP Q_PROPERTY(QString virtualHost READ virtualHost WRITE setVirtualHost); Q_PROPERTY(QString user READ user WRITE setUser); Q_PROPERTY(QString password READ password WRITE setPassword); + Q_PROPERTY(bool ssl READ isSsl WRITE setSsl); Q_DISABLE_COPY(Client) @@ -64,6 +65,11 @@ namespace QAMQP void open(const QUrl & connectionString); void close(); void reopen(); + + bool isSsl() const; + void setSsl(bool value); + + protected: ClientPrivate * const pd_ptr; diff --git a/src/qamqp/amqp_global.h b/src/qamqp/amqp_global.h index 68c5783..e3d29c1 100644 --- a/src/qamqp/amqp_global.h +++ b/src/qamqp/amqp_global.h @@ -5,6 +5,7 @@ #define QAMQP_P_INCLUDE #define AMQPSCHEME "amqp" +#define AMQPSSCHEME "amqps" #define AMQPPORT 5672 #define AMQPHOST "localhost" #define AMQPVHOST "/" diff --git a/src/qamqp/amqp_network.cpp b/src/qamqp/amqp_network.cpp index dfb1060..4f8d94b 100644 --- a/src/qamqp/amqp_network.cpp +++ b/src/qamqp/amqp_network.cpp @@ -6,17 +6,14 @@ QAMQP::Network::Network( QObject * parent /*= 0*/ ):QObject(parent) { qRegisterMetaType("QAMQP::Frame::Method"); - socket_ = new QTcpSocket(this); + buffer_ = new QBuffer(this); offsetBuf = 0; leftSize = 0; - buffer_->open(QIODevice::ReadWrite); - connect(socket_, SIGNAL(connected()), this, SLOT(connected())); - connect(socket_, SIGNAL(disconnected()), this, SLOT(disconnected())); - connect(socket_, SIGNAL(readyRead()), this, SLOT(readyRead())); - connect(socket_, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(error(QAbstractSocket::SocketError))); + + initSocket(false); } QAMQP::Network::~Network() @@ -26,7 +23,13 @@ QAMQP::Network::~Network() void QAMQP::Network::connectTo( const QString & host, quint32 port ) { - socket_->connectToHost(host, port); + if (isSsl()) + { + static_cast(socket_.data())->connectToHostEncrypted(host, port); + } else { + socket_->connectToHost(host, port); + } + } void QAMQP::Network::disconnect() @@ -37,8 +40,14 @@ void QAMQP::Network::disconnect() void QAMQP::Network::connected() { - char header_[8] = {'A', 'M', 'Q', 'P', 0,0,9,1}; - socket_->write(header_, 8); + if(isSsl() && !static_cast(socket_.data())->isEncrypted() ) + { + qDebug() << "[SSL] start encrypt"; + static_cast(socket_.data())->startClientEncryption(); + } else { + conectionReady(); + } + } void QAMQP::Network::disconnected() @@ -118,4 +127,50 @@ void QAMQP::Network::sendFrame( const QAMQP::Frame::Base & frame ) { QDataStream stream(socket_); frame.toStream(stream); +} + +bool QAMQP::Network::isSsl() const +{ + return QString(socket_->metaObject()->className()).compare( "QSslSocket", Qt::CaseInsensitive) == 0; +} + +void QAMQP::Network::setSsl( bool value ) +{ + initSocket(value); +} + +void QAMQP::Network::initSocket( bool ssl /*= false*/ ) +{ + if(socket_) + delete socket_; + + if(ssl) + { + socket_ = new QSslSocket(this); + QSslSocket * ssl_= static_cast (socket_.data()); + ssl_->setProtocol(QSsl::AnyProtocol); + connect(socket_, SIGNAL(sslErrors(const QList &)), + this, SLOT(sslErrors(const QList &))); + + //connect(socket_, SIGNAL(encrypted()), this, SLOT(conectionReady())); + connect(socket_, SIGNAL(connected()), this, SLOT(conectionReady())); + } else { + socket_ = new QTcpSocket(this); + connect(socket_, SIGNAL(connected()), this, SLOT(conectionReady())); + } + + connect(socket_, SIGNAL(disconnected()), this, SLOT(disconnected())); + connect(socket_, SIGNAL(readyRead()), this, SLOT(readyRead())); + connect(socket_, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(error(QAbstractSocket::SocketError))); +} + +void QAMQP::Network::sslErrors( const QList & errors ) +{ + static_cast(socket_.data())->ignoreSslErrors(); +} + +void QAMQP::Network::conectionReady() +{ + char header_[8] = {'A', 'M', 'Q', 'P', 0,0,9,1}; + socket_->write(header_, 8); } \ No newline at end of file diff --git a/src/qamqp/amqp_network.h b/src/qamqp/amqp_network.h index 3b9498d..c3b196c 100644 --- a/src/qamqp/amqp_network.h +++ b/src/qamqp/amqp_network.h @@ -3,6 +3,7 @@ #include #include +#include #include #include @@ -24,6 +25,9 @@ namespace QAMQP void sendFrame(const QAMQP::Frame::Base & frame); + bool isSsl() const; + void setSsl(bool value); + signals: void method(const QAMQP::Frame::Method & method); void content(const QAMQP::Frame::Content & content); @@ -34,8 +38,12 @@ namespace QAMQP void disconnected(); void error( QAbstractSocket::SocketError socketError ); void readyRead(); + void sslErrors ( const QList & errors ); + + void conectionReady(); private: + void initSocket(bool ssl = false); QPointer socket_; QPointer buffer_; int offsetBuf; diff --git a/src/qamqp/amqp_p.h b/src/qamqp/amqp_p.h index c9d7663..adcf485 100644 --- a/src/qamqp/amqp_p.h +++ b/src/qamqp/amqp_p.h @@ -38,6 +38,8 @@ namespace QAMQP QPointer connection_; QSharedPointer auth_; + bool isSSl() const; + Client * const pq_ptr;