PDA

View Full Version : TcpSocket encrypted() signal



eleanor
23rd April 2009, 06:44
Hi, I don't know why the encrypted signal is not emitted in this code:



SSLServer::SSLServer(int socket_descriptor, QObject *parent) : QObject(parent) {
/* create server socket */
server = new QSslSocket(this);

/* call a slot after 1 second - to terminate the unauthenticated connection */
QTimer::singleShot(1000, this, SLOT(abort_connection()));

/* set socket descriptor */
if(!server->setSocketDescriptor(socket_descriptor)) {
qWarning("Failed to set socket descriptor in SSLServer");
close(socket_descriptor);
delete this;
return;
}

/* add CA certificate: it is used by the handshake process to validate the peer's certificate*/
QSslCertificate ca_cert = handle_certificate(":/central_authority.crt");
server->addCaCertificate(ca_cert);

/* set the server's (LOCAL) digital certificate */
QSslCertificate server_cert = handle_certificate(":/server.crt");
server->setLocalCertificate(server_cert);

/* set the server's (LOCAL) private key -> [key+certificate == prove identity to SSL peer] */
server->setPrivateKey(":/server.key", QSsl::Rsa, QSsl::Pem, "");

/* set cipher protocol */
server->setProtocol(QSsl::SslV3);

/* server has to ask the client to send the certificate */
/* the client ask the server to send the certificate by default */
server->setPeerVerifyMode(QSslSocket::VerifyPeer);

/* starts a delayed SSL handshake */
server->startServerEncryption();

#ifdef SSL_DEBUG
/* wait for socket to complete SSL handshake -> when encrypted it emits encrypted signal */
if(server->waitForEncrypted(1000))
print_socket_info();
#endif

connection_established();

/* if handshake is successful and encrypted socket is ready to use */
connect(server, SIGNAL(encrypted()), this, SLOT(connection_established()));
/* if error occurs the sslErrors() signal is emitted */
connect(server, SIGNAL(sslErrors(const QList<QSslError> &)), this, SLOT(error_occured(const QList<QSslError> &)));
}

void SSLServer::connection_established() {
qDebug() << "SSL Handshake succedded. The socket is now encrypted." << endl;
get_certificate_data();
create_files_dir();
}


This is the server...on the client the encrypted() signal is emitted without a problem.

Any ideas...I need functionality to know when a socket is encryted, so I can start sending files to the client...thanks