summaryrefslogtreecommitdiff
path: root/distfoldd/server.cc
diff options
context:
space:
mode:
authorJavier S. Pedro <maemo@javispedro.com>2012-09-17 23:03:03 +0200
committerJavier S. Pedro <maemo@javispedro.com>2012-09-17 23:03:03 +0200
commitc3a1946675855b299a2b36550cdf2c2f69d153aa (patch)
treef7adf66404cdc47994225b616bcaf082a07dd168 /distfoldd/server.cc
downloaddistfold-c3a1946675855b299a2b36550cdf2c2f69d153aa.tar.gz
distfold-c3a1946675855b299a2b36550cdf2c2f69d153aa.zip
initial import
Diffstat (limited to 'distfoldd/server.cc')
-rw-r--r--distfoldd/server.cc56
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();
+}