From 35ab86d32f8ad6bd87f62404850d8be425fe46fc Mon Sep 17 00:00:00 2001 From: Chocobo1 Date: Mon, 10 Apr 2017 19:17:51 +0800 Subject: [PATCH 1/4] Refactor: group port forwarding code together Unify log message --- src/webui/webui.cpp | 44 +++++++++++++++++++++++++------------------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/src/webui/webui.cpp b/src/webui/webui.cpp index 7e0f2996a..63a055a21 100644 --- a/src/webui/webui.cpp +++ b/src/webui/webui.cpp @@ -45,24 +45,33 @@ WebUI::WebUI(QObject *parent) void WebUI::init() { - Preferences* const pref = Preferences::instance(); Logger* const logger = Logger::instance(); + Preferences* const pref = Preferences::instance(); - if (pref->isWebUiEnabled()) { - const quint16 port = pref->getWebUiPort(); - if (m_port != port) { - Net::PortForwarder::instance()->deletePort(port); - m_port = port; - } + const quint16 oldPort = m_port; + m_port = pref->getWebUiPort(); - if (httpServer_) { - if (httpServer_->serverPort() != m_port) - httpServer_->close(); + if (pref->isWebUiEnabled()) { + // UPnP/NAT-PMP + if (pref->useUPnPForWebUIPort()) { + if (m_port != oldPort) { + Net::PortForwarder::instance()->deletePort(oldPort); + Net::PortForwarder::instance()->addPort(m_port); + } } else { + Net::PortForwarder::instance()->deletePort(oldPort); + } + + // http server + if (!httpServer_) { webapp_ = new WebApplication(this); httpServer_ = new Http::Server(webapp_, this); } + else { + if (httpServer_->serverPort() != m_port) + httpServer_->close(); + } #ifndef QT_NO_OPENSSL if (pref->isWebUiHttpsEnabled()) { @@ -87,9 +96,9 @@ void WebUI::init() if (!httpServer_->isListening()) { bool success = httpServer_->listen(QHostAddress::Any, m_port); if (success) - logger->addMessage(tr("The Web UI is listening on port %1").arg(m_port)); + logger->addMessage(tr("Web UI: Now listening on port %1").arg(m_port)); else - logger->addMessage(tr("Web UI Error - Unable to bind Web UI to port %1").arg(m_port), Log::CRITICAL); + logger->addMessage(tr("Web UI: Unable to bind to port %1").arg(m_port), Log::CRITICAL); } // DynDNS @@ -103,20 +112,17 @@ void WebUI::init() if (dynDNSUpdater_) delete dynDNSUpdater_; } - - // Use UPnP/NAT-PMP for Web UI - if (pref->useUPnPForWebUIPort()) - Net::PortForwarder::instance()->addPort(m_port); - else - Net::PortForwarder::instance()->deletePort(m_port); } else { + Net::PortForwarder::instance()->deletePort(oldPort); + if (httpServer_) delete httpServer_; + if (webapp_) delete webapp_; + if (dynDNSUpdater_) delete dynDNSUpdater_; - Net::PortForwarder::instance()->deletePort(m_port); } } From 05d8c46bb00c46cb1a0281ab300c561251cccf4f Mon Sep 17 00:00:00 2001 From: Chocobo1 Date: Mon, 10 Apr 2017 19:41:20 +0800 Subject: [PATCH 2/4] Rename class variables --- src/webui/webui.cpp | 42 +++++++++++++++++++++--------------------- src/webui/webui.h | 6 +++--- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/webui/webui.cpp b/src/webui/webui.cpp index 63a055a21..927a5d9cc 100644 --- a/src/webui/webui.cpp +++ b/src/webui/webui.cpp @@ -64,13 +64,13 @@ void WebUI::init() } // http server - if (!httpServer_) { - webapp_ = new WebApplication(this); - httpServer_ = new Http::Server(webapp_, this); + if (!m_httpServer) { + m_webapp = new WebApplication(this); + m_httpServer = new Http::Server(m_webapp, this); } else { - if (httpServer_->serverPort() != m_port) - httpServer_->close(); + if (m_httpServer->serverPort() != m_port) + m_httpServer->close(); } #ifndef QT_NO_OPENSSL @@ -84,17 +84,17 @@ void WebUI::init() const bool areCertsValid = !certs.empty() && std::all_of(certs.begin(), certs.end(), [](QSslCertificate c) { return !c.isNull(); }); if (!key.isNull() && areCertsValid) - httpServer_->enableHttps(certs, key); + m_httpServer->enableHttps(certs, key); else - httpServer_->disableHttps(); + m_httpServer->disableHttps(); } else { - httpServer_->disableHttps(); + m_httpServer->disableHttps(); } #endif - if (!httpServer_->isListening()) { - bool success = httpServer_->listen(QHostAddress::Any, m_port); + if (!m_httpServer->isListening()) { + bool success = m_httpServer->listen(QHostAddress::Any, m_port); if (success) logger->addMessage(tr("Web UI: Now listening on port %1").arg(m_port)); else @@ -103,26 +103,26 @@ void WebUI::init() // DynDNS if (pref->isDynDNSEnabled()) { - if (!dynDNSUpdater_) - dynDNSUpdater_ = new Net::DNSUpdater(this); + if (!m_dnsUpdater) + m_dnsUpdater = new Net::DNSUpdater(this); else - dynDNSUpdater_->updateCredentials(); + m_dnsUpdater->updateCredentials(); } else { - if (dynDNSUpdater_) - delete dynDNSUpdater_; + if (m_dnsUpdater) + delete m_dnsUpdater; } } else { Net::PortForwarder::instance()->deletePort(oldPort); - if (httpServer_) - delete httpServer_; + if (m_httpServer) + delete m_httpServer; - if (webapp_) - delete webapp_; + if (m_webapp) + delete m_webapp; - if (dynDNSUpdater_) - delete dynDNSUpdater_; + if (m_dnsUpdater) + delete m_dnsUpdater; } } diff --git a/src/webui/webui.h b/src/webui/webui.h index 5f156a92e..a7903640b 100644 --- a/src/webui/webui.h +++ b/src/webui/webui.h @@ -55,9 +55,9 @@ private slots: void init(); private: - QPointer httpServer_; - QPointer dynDNSUpdater_; - QPointer webapp_; + QPointer m_httpServer; + QPointer m_dnsUpdater; + QPointer m_webapp; quint16 m_port; }; From 7f346b49a72dd623e04db3a116057515d4558bfa Mon Sep 17 00:00:00 2001 From: Chocobo1 Date: Mon, 10 Apr 2017 20:04:02 +0800 Subject: [PATCH 3/4] Refactor: move the validation of certificates & key functions under Server class Rename method Add log messages --- src/base/http/server.cpp | 24 ++++++++++++++++++++---- src/base/http/server.h | 2 +- src/webui/webui.cpp | 17 ++++++----------- 3 files changed, 27 insertions(+), 16 deletions(-) diff --git a/src/base/http/server.cpp b/src/base/http/server.cpp index be1877d38..5b144e308 100644 --- a/src/base/http/server.cpp +++ b/src/base/http/server.cpp @@ -61,11 +61,27 @@ Server::~Server() } #ifndef QT_NO_OPENSSL -void Server::enableHttps(const QList &certificates, const QSslKey &key) +bool Server::setupHttps(const QByteArray &certificates, const QByteArray &key) { - m_certificates = certificates; - m_key = key; - m_https = true; + QSslKey sslKey(key, QSsl::Rsa); + if (sslKey.isNull()) + sslKey = QSslKey(key, QSsl::Ec); + + const QList certs = QSslCertificate::fromData(certificates); + const bool areCertsValid = !certs.empty() && std::all_of(certs.begin(), certs.end(), [](const QSslCertificate &c) { return !c.isNull(); }); + + if (!sslKey.isNull() && areCertsValid) + { + m_key = sslKey; + m_certificates = certs; + m_https = true; + return true; + } + else + { + disableHttps(); + return false; + } } void Server::disableHttps() diff --git a/src/base/http/server.h b/src/base/http/server.h index 7f8f3af7c..3ffb329cd 100644 --- a/src/base/http/server.h +++ b/src/base/http/server.h @@ -55,7 +55,7 @@ namespace Http ~Server(); #ifndef QT_NO_OPENSSL - void enableHttps(const QList &certificates, const QSslKey &key); + bool setupHttps(const QByteArray &certificates, const QByteArray &key); void disableHttps(); #endif diff --git a/src/webui/webui.cpp b/src/webui/webui.cpp index 927a5d9cc..6b03ef04d 100644 --- a/src/webui/webui.cpp +++ b/src/webui/webui.cpp @@ -75,18 +75,13 @@ void WebUI::init() #ifndef QT_NO_OPENSSL if (pref->isWebUiHttpsEnabled()) { - const QByteArray keyRaw = pref->getWebUiHttpsKey(); - QSslKey key(keyRaw, QSsl::Rsa); - if (key.isNull()) - key = QSslKey(keyRaw, QSsl::Ec); - - const QList certs = QSslCertificate::fromData(pref->getWebUiHttpsCertificate()); - const bool areCertsValid = !certs.empty() && std::all_of(certs.begin(), certs.end(), [](QSslCertificate c) { return !c.isNull(); }); - - if (!key.isNull() && areCertsValid) - m_httpServer->enableHttps(certs, key); + const QByteArray certs = pref->getWebUiHttpsCertificate(); + const QByteArray key = pref->getWebUiHttpsKey(); + bool success = m_httpServer->setupHttps(certs, key); + if (success) + logger->addMessage(tr("Web UI: https setup successful")); else - m_httpServer->disableHttps(); + logger->addMessage(tr("Web UI: https setup failed, fallback to http"), Log::CRITICAL); } else { m_httpServer->disableHttps(); From d1ee54f6ea0b66482f9f3e1af4daf0133ff17092 Mon Sep 17 00:00:00 2001 From: Chocobo1 Date: Mon, 10 Apr 2017 20:10:48 +0800 Subject: [PATCH 4/4] Refactor: move methods under the same #if section. --- src/base/http/server.cpp | 56 +++++++++++++++++++--------------------- src/base/http/server.h | 6 +++-- 2 files changed, 31 insertions(+), 31 deletions(-) diff --git a/src/base/http/server.cpp b/src/base/http/server.cpp index 5b144e308..35be36d98 100644 --- a/src/base/http/server.cpp +++ b/src/base/http/server.cpp @@ -60,6 +60,33 @@ Server::~Server() { } +void Server::incomingConnection(qintptr socketDescriptor) +{ + QTcpSocket *serverSocket; +#ifndef QT_NO_OPENSSL + if (m_https) + serverSocket = new QSslSocket(this); + else +#endif + serverSocket = new QTcpSocket(this); + + if (serverSocket->setSocketDescriptor(socketDescriptor)) { +#ifndef QT_NO_OPENSSL + if (m_https) { + static_cast(serverSocket)->setProtocol(QSsl::SecureProtocols); + static_cast(serverSocket)->setPrivateKey(m_key); + static_cast(serverSocket)->setLocalCertificateChain(m_certificates); + static_cast(serverSocket)->setPeerVerifyMode(QSslSocket::VerifyNone); + static_cast(serverSocket)->startServerEncryption(); + } +#endif + new Connection(serverSocket, m_requestHandler, this); + } + else { + serverSocket->deleteLater(); + } +} + #ifndef QT_NO_OPENSSL bool Server::setupHttps(const QByteArray &certificates, const QByteArray &key) { @@ -90,36 +117,7 @@ void Server::disableHttps() m_certificates.clear(); m_key.clear(); } -#endif - -void Server::incomingConnection(qintptr socketDescriptor) -{ - QTcpSocket *serverSocket; -#ifndef QT_NO_OPENSSL - if (m_https) - serverSocket = new QSslSocket(this); - else -#endif - serverSocket = new QTcpSocket(this); - - if (serverSocket->setSocketDescriptor(socketDescriptor)) { -#ifndef QT_NO_OPENSSL - if (m_https) { - static_cast(serverSocket)->setProtocol(QSsl::SecureProtocols); - static_cast(serverSocket)->setPrivateKey(m_key); - static_cast(serverSocket)->setLocalCertificateChain(m_certificates); - static_cast(serverSocket)->setPeerVerifyMode(QSslSocket::VerifyNone); - static_cast(serverSocket)->startServerEncryption(); - } -#endif - new Connection(serverSocket, m_requestHandler, this); - } - else { - serverSocket->deleteLater(); - } -} -#ifndef QT_NO_OPENSSL QList Server::safeCipherList() const { const QStringList badCiphers = {"idea", "rc4"}; diff --git a/src/base/http/server.h b/src/base/http/server.h index 3ffb329cd..31f33b735 100644 --- a/src/base/http/server.h +++ b/src/base/http/server.h @@ -34,6 +34,7 @@ #define HTTP_SERVER_H #include + #ifndef QT_NO_OPENSSL #include #include @@ -60,12 +61,13 @@ namespace Http #endif private: - IRequestHandler *m_requestHandler; - void incomingConnection(qintptr socketDescriptor); + IRequestHandler *m_requestHandler; + #ifndef QT_NO_OPENSSL QList safeCipherList() const; + bool m_https; QList m_certificates; QSslKey m_key;