diff options
Diffstat (limited to 'distfoldd/server.cc')
-rw-r--r-- | distfoldd/server.cc | 56 |
1 files changed, 56 insertions, 0 deletions
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 <QtCore/QDebug> +#include <QtCore/QDir> +#include <QtNetwork/QSslSocket> + +#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<QSslSocket*>(sender()); + qDebug() << "Server socket error:" << socket->error() << socket->errorString(); +} |