aboutsummaryrefslogtreecommitdiff
path: root/src/QXmppServer.cpp
diff options
context:
space:
mode:
authorJeremy Lainé <jeremy.laine@m4x.org>2011-03-16 18:38:58 +0000
committerJeremy Lainé <jeremy.laine@m4x.org>2011-03-16 18:38:58 +0000
commit9f24c3aa24fa67554322c4e3b785aa6e92895642 (patch)
tree06764d72253e8e7d272de04e40f9559e4e815a14 /src/QXmppServer.cpp
parent1bd3eecff28c2b0d080102c26fd89dc3f56b4e09 (diff)
downloadqxmpp-9f24c3aa24fa67554322c4e3b785aa6e92895642.tar.gz
load SSL certificates & key only once, to reduce load when clients connect
Diffstat (limited to 'src/QXmppServer.cpp')
-rw-r--r--src/QXmppServer.cpp53
1 files changed, 32 insertions, 21 deletions
diff --git a/src/QXmppServer.cpp b/src/QXmppServer.cpp
index 8f199552..a5c07174 100644
--- a/src/QXmppServer.cpp
+++ b/src/QXmppServer.cpp
@@ -24,6 +24,8 @@
#include <QDomElement>
#include <QFileInfo>
#include <QPluginLoader>
+#include <QSslCertificate>
+#include <QSslKey>
#include <QSslSocket>
#include "QXmppConstants.h"
@@ -308,8 +310,9 @@ void QXmppServer::addCaCertificates(const QString &path)
{
if (!path.isEmpty() && !QFileInfo(path).isReadable())
d->warning(QString("SSL CA certificates are not readable %1").arg(path));
- d->serverForClients->addCaCertificates(path);
- d->serverForServers->addCaCertificates(path);
+ QList<QSslCertificate> certificates = QSslCertificate::fromPath(path);
+ d->serverForClients->addCaCertificates(certificates);
+ d->serverForServers->addCaCertificates(certificates);
}
/// Sets the path for the local SSL certificate.
@@ -318,10 +321,14 @@ void QXmppServer::addCaCertificates(const QString &path)
void QXmppServer::setLocalCertificate(const QString &path)
{
- if (!path.isEmpty() && !QFileInfo(path).isReadable())
+ QSslCertificate certificate;
+ QFile file(path);
+ if (!path.isEmpty() && file.open(QIODevice::ReadOnly | QIODevice::Text))
+ certificate = QSslCertificate(file.readAll());
+ else
d->warning(QString("SSL certificate is not readable %1").arg(path));
- d->serverForClients->setLocalCertificate(path);
- d->serverForServers->setLocalCertificate(path);
+ d->serverForClients->setLocalCertificate(certificate);
+ d->serverForServers->setLocalCertificate(certificate);
}
/// Sets the path for the local SSL private key.
@@ -330,10 +337,14 @@ void QXmppServer::setLocalCertificate(const QString &path)
void QXmppServer::setPrivateKey(const QString &path)
{
- if (!path.isEmpty() && !QFileInfo(path).isReadable())
+ QSslKey key;
+ QFile file(path);
+ if (!path.isEmpty() && file.open(QIODevice::ReadOnly))
+ key = QSslKey(file.readAll(), QSsl::Rsa);
+ else
d->warning(QString("SSL key is not readable %1").arg(path));
- d->serverForClients->setPrivateKey(path);
- d->serverForServers->setPrivateKey(path);
+ d->serverForClients->setPrivateKey(key);
+ d->serverForServers->setPrivateKey(key);
}
/// Listen for incoming XMPP client connections.
@@ -835,9 +846,9 @@ void QXmppServer::slotStreamDisconnected()
class QXmppSslServerPrivate
{
public:
- QString caCertificates;
- QString localCertificate;
- QString privateKey;
+ QList<QSslCertificate> caCertificates;
+ QSslCertificate localCertificate;
+ QSslKey privateKey;
};
/// Constructs a new SSL server instance.
@@ -862,7 +873,7 @@ void QXmppSslServer::incomingConnection(int socketDescriptor)
{
QSslSocket *socket = new QSslSocket;
socket->setSocketDescriptor(socketDescriptor);
- if (!d->localCertificate.isEmpty() && !d->privateKey.isEmpty())
+ if (!d->localCertificate.isNull() && !d->privateKey.isNull())
{
socket->setProtocol(QSsl::AnyProtocol);
socket->addCaCertificates(d->caCertificates);
@@ -875,28 +886,28 @@ void QXmppSslServer::incomingConnection(int socketDescriptor)
/// Adds the given certificates to the CA certificate database to be used
/// for incoming connnections.
///
-/// \param caCertificates
+/// \param certificates
-void QXmppSslServer::addCaCertificates(const QString &caCertificates)
+void QXmppSslServer::addCaCertificates(const QList<QSslCertificate> &certificates)
{
- d->caCertificates = caCertificates;
+ d->caCertificates += certificates;
}
/// Sets the local certificate to be used for incoming connections.
///
-/// \param localCertificate
+/// \param certificate
-void QXmppSslServer::setLocalCertificate(const QString &localCertificate)
+void QXmppSslServer::setLocalCertificate(const QSslCertificate &certificate)
{
- d->localCertificate = localCertificate;
+ d->localCertificate = certificate;
}
/// Sets the local private key to be used for incoming connections.
///
-/// \param privateKey
+/// \param key
-void QXmppSslServer::setPrivateKey(const QString &privateKey)
+void QXmppSslServer::setPrivateKey(const QSslKey &key)
{
- d->privateKey = privateKey;
+ d->privateKey = key;
}