diff --git a/src/server.cpp b/src/server.cpp index cc48586..e00dccd 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -18,7 +18,6 @@ Server::Server(int p_ws_port, int p_wss_port, QObject *parent) : m_secure_port(p_wss_port), m_player_count(0) { - timer = new QTimer(this); db_manager = new DBManager; @@ -34,6 +33,10 @@ Server::Server(int p_ws_port, int p_wss_port, QObject *parent) : connect(this, &Server::logConnectionAttempt, logger, &ULogger::logConnectionAttempt); AOPacket::registerPackets(); + + // Initialize both servers + server = new QWebSocketServer(QStringLiteral("Akashi"), QWebSocketServer::NonSecureMode, this); + secure_server = new QWebSocketServer(QStringLiteral("Akashi"), QWebSocketServer::SecureMode, this); } void Server::start() @@ -47,8 +50,10 @@ void Server::start() bind_addr = QHostAddress(bind_ip); if (bind_addr.protocol() != QAbstractSocket::IPv4Protocol && bind_addr.protocol() != QAbstractSocket::IPv6Protocol && bind_addr != QHostAddress::Any) { qDebug() << bind_ip << "is an invalid IP address to listen on! Server not starting, check your config."; + return; } + // Configure SSL for secure server QSettings settings("config/ssl.ini", QSettings::IniFormat); QString privateKeyPath = settings.value("SSL/privateKey").toString(); @@ -60,42 +65,50 @@ void Server::start() QFile keyFile(privateKeyPath); if (!keyFile.open(QIODevice::ReadOnly)) { qWarning() << "Unable to open private key file."; - return; } - QSslKey privateKey(&keyFile, QSsl::Rsa); - keyFile.close(); + else { + QSslKey privateKey(&keyFile, QSsl::Rsa); + keyFile.close(); - QFile certFile(certificatePath); - if (!certFile.open(QIODevice::ReadOnly)) { - qWarning() << "Unable to open certificate file."; - return; + QFile certFile(certificatePath); + if (!certFile.open(QIODevice::ReadOnly)) { + qWarning() << "Unable to open certificate file."; + } + else { + QSslCertificate certificate(&certFile); + certFile.close(); + + QFile caFile(caCertificatePath); + if (caFile.open(QIODevice::ReadOnly)) { + QSslCertificate caCertificate(&caFile); + sslConfig.addCaCertificate(caCertificate); + caFile.close(); + } + + sslConfig.setPrivateKey(privateKey); + sslConfig.setLocalCertificate(certificate); + secure_server->setSslConfiguration(sslConfig); + } } - QSslCertificate certificate(&certFile); - certFile.close(); - - - QFile caFile(caCertificatePath); - if (caFile.open(QIODevice::ReadOnly)) { - QSslCertificate caCertificate(&caFile); - sslConfig.addCaCertificate(caCertificate); - caFile.close(); - } - - sslConfig.setPrivateKey(privateKey); - sslConfig.setLocalCertificate(certificate); - - server = new QWebSocketServer(QStringLiteral("Akashi"), QWebSocketServer::SecureMode, this); - server->setSslConfiguration(sslConfig); - - + // Start non-secure server if (!server->listen(bind_addr, m_port)) { - qDebug() << "Server error:" << server->errorString(); + qDebug() << "Non-secure server error:" << server->errorString(); } else { connect(server, &QWebSocketServer::newConnection, this, &Server::clientConnected); - qInfo() << "Server listening on" << server->serverPort(); + qInfo() << "Non-secure server listening on" << server->serverPort(); + } + + // Start secure server + if (!secure_server->listen(bind_addr, m_secure_port)) { + qDebug() << "Secure server error:" << secure_server->errorString(); + } + else { + connect(secure_server, &QWebSocketServer::newConnection, + this, &Server::clientConnected); + qInfo() << "Secure server listening on" << secure_server->serverPort(); } // Construct modern advertiser if enabled in config @@ -108,7 +121,6 @@ void Server::start() m_backgrounds = ConfigManager::backgrounds(); // Build our music manager. - MusicList l_musiclist = ConfigManager::musiclist(); music_manager = new MusicManager(ConfigManager::cdnList(), l_musiclist, ConfigManager::ordered_songs(), this); connect(music_manager, &MusicManager::sendFMPacket, this, &Server::unicast); diff --git a/src/server.h b/src/server.h index 354c356..1c6f426 100644 --- a/src/server.h +++ b/src/server.h @@ -408,6 +408,7 @@ class Server : public QObject * @brief Listens for incoming websocket connections. */ QWebSocketServer *server; + QWebSocketServer *secure_server; /** * @brief Handles HTTP server advertising.