From c3a1946675855b299a2b36550cdf2c2f69d153aa Mon Sep 17 00:00:00 2001 From: "Javier S. Pedro" Date: Mon, 17 Sep 2012 23:03:03 +0200 Subject: initial import --- distfoldd/server.cc | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 distfoldd/server.cc (limited to 'distfoldd/server.cc') diff --git a/distfoldd/server.cc b/distfoldd/server.cc new file mode 100644 index 0000000..0361466 --- /dev/null +++ b/distfoldd/server.cc @@ -0,0 +1,56 @@ +#include +#include +#include + +#include "server.h" + +Server::Server(QObject *parent) : + QTcpServer(parent) +{ + loadKeys(); + if (!listen()) { + qWarning() << "Failed to start server socket"; + } +} + +void Server::loadKeys() +{ + QDir config_dir(QDir::home().absoluteFilePath(".config/distfold")); + QFile cert_file(config_dir.absoluteFilePath("server.crt")); + if (cert_file.open(QIODevice::ReadOnly)) { + _cert = QSslCertificate(&cert_file, QSsl::Pem); + cert_file.close(); + } + if (_cert.isNull()) { + qWarning() << "Could not load server certificate"; + } + QFile key_file(config_dir.absoluteFilePath("server.key")); + if (key_file.open(QIODevice::ReadOnly)) { + _key = QSslKey(&key_file, QSsl::Rsa, QSsl::Pem); + key_file.close(); + } + if (_key.isNull()) { + qWarning() << "Could not load private key"; + } +} + +void Server::incomingConnection(int socketDescriptor) +{ + QSslSocket *socket = new QSslSocket(this); + connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), + SLOT(handleSocketError(QAbstractSocket::SocketError))); + if (socket->setSocketDescriptor(socketDescriptor)) { + socket->setLocalCertificate(_cert); + socket->setPrivateKey(_key); + socket->startServerEncryption(); + addPendingConnection(socket); + } else { + delete socket; + } +} + +void Server::handleSocketError(QAbstractSocket::SocketError error) +{ + QSslSocket *socket = qobject_cast(sender()); + qDebug() << "Server socket error:" << socket->error() << socket->errorString(); +} -- cgit v1.2.3