diff --git a/src/preferences/preferences.h b/src/preferences/preferences.h index f998a4511..bd29cc189 100644 --- a/src/preferences/preferences.h +++ b/src/preferences/preferences.h @@ -37,6 +37,8 @@ #include #include #include +#include +#include #include #ifndef DISABLE_GUI @@ -773,6 +775,36 @@ public: return pass_ha1; } + bool isWebUiHttpsEnabled() const { + return value("Preferences/WebUI/HTTPS/Enabled", false).toBool(); + } + + void setWebUiHttpsEnabled(bool enabled) { + setValue("Preferences/WebUI/HTTPS/Enabled", enabled); + } + + QSslCertificate getWebUiHttpsCertificate() const { + return QSslCertificate(value("Preferences/WebUI/HTTPS/Certificate").toByteArray()); + } + + void setWebUiHttpsCertificate(QString filename) { + QFile file(filename); + file.open(QIODevice::ReadOnly); + setValue("Preferences/WebUI/HTTPS/Certificate", file.readAll()); + file.close(); + } + + QSslKey getWebUiHttpsKey() const { + return QSslKey(value("Preferences/WebUI/HTTPS/Key").toByteArray(), QSsl::Rsa); + } + + void setWebUiHttpsKey(QString filename) { + QFile file(filename); + file.open(QIODevice::ReadOnly); + setValue("Preferences/WebUI/HTTPS/Key", file.readAll()); + file.close(); + } + bool isDynDNSEnabled() const { return value("Preferences/DynDNS/Enabled", false).toBool(); } diff --git a/src/webui/httpserver.cpp b/src/webui/httpserver.cpp index 49d893ee5..3875a8e12 100644 --- a/src/webui/httpserver.cpp +++ b/src/webui/httpserver.cpp @@ -38,6 +38,7 @@ #include #include #include +#include using namespace libtorrent; @@ -87,6 +88,11 @@ HttpServer::HttpServer(int msec, QObject* parent) : QTcpServer(parent) { username = pref.getWebUiUsername().toLocal8Bit(); password_ha1 = pref.getWebUiPassword().toLocal8Bit(); m_localAuth = pref.isWebUiLocalAuthEnabled(); + m_https = pref.isWebUiHttpsEnabled(); + if (m_https) { + m_certificate = pref.getWebUiHttpsCertificate(); + m_key = pref.getWebUiHttpsKey(); + } connect(this, SIGNAL(newConnection()), this, SLOT(newHttpConnection())); manager = new EventManager(this); //add torrents @@ -141,6 +147,36 @@ HttpServer::~HttpServer() delete manager; } +void HttpServer::incomingConnection(int socketDescriptor) +{ + QTcpSocket *serverSocket; + QSslSocket *serverSslSocket; + if (m_https) + { + serverSslSocket = new QSslSocket; + serverSocket = serverSslSocket; + } + else + { + serverSocket = new QTcpSocket; + } + if (serverSocket->setSocketDescriptor(socketDescriptor)) + { + if (m_https) + { + serverSslSocket->setProtocol(QSsl::AnyProtocol); + serverSslSocket->setPrivateKey(m_key); + serverSslSocket->setLocalCertificate(m_certificate); + serverSslSocket->startServerEncryption(); + } + addPendingConnection(serverSocket); + } + else + { + delete serverSocket; + } +} + void HttpServer::newHttpConnection() { QTcpSocket *socket; diff --git a/src/webui/httpserver.h b/src/webui/httpserver.h index b8886d67f..b78ecca50 100644 --- a/src/webui/httpserver.h +++ b/src/webui/httpserver.h @@ -63,6 +63,9 @@ public: void increaseNbFailedAttemptsForIp(QString ip); void resetNbFailedAttemptsForIp(QString ip); +private: + void incomingConnection(int socketDescriptor); + private slots: void newHttpConnection(); void onTimer(); @@ -75,6 +78,9 @@ private: QTimer *timer; QHash client_failed_attempts; bool m_localAuth; + bool m_https; + QSslCertificate m_certificate; + QSslKey m_key; }; #endif