#include "loggingcategories.h" #include "proxyconfiguration.h" #include #include #include #include namespace remoteproxy { ProxyConfiguration::ProxyConfiguration(QObject *parent) : QObject(parent) { } bool ProxyConfiguration::loadConfiguration(const QString &fileName) { m_fileName = fileName; QFileInfo fileInfo(m_fileName); if (!fileInfo.exists()) { qCWarning(dcApplication()) << "Configuration: Could not find configuration file" << m_fileName; return false; } if (!fileInfo.isReadable()) { qCWarning(dcApplication()) << "Configuration: Cannot read configuration file" << m_fileName; return false; } QSettings settings(m_fileName, QSettings::IniFormat); settings.beginGroup("ProxyServer"); setServerName(settings.value("name", "nymea-remoteproxy").toString()); setWriteLogFile(settings.value("writeLogs", false).toBool()); setLogFileName(settings.value("logFile", "/var/log/nymea-remoteproxy.log").toString()); setMonitorSocketFileName(settings.value("monitorSocket", "/tmp/nymea-remoteproxy.monitor").toString()); settings.endGroup(); settings.beginGroup("SSL"); setSslCertificateFileName(settings.value("certificate", "/etc/ssl/certs/ssl-cert-snakeoil.pem").toString()); setSslCertificateKeyFileName(settings.value("certificateKey", "/etc/ssl/private/ssl-cert-snakeoil.key").toString()); setSslCertificateChainFileName(settings.value("certificateChain", "").toString()); settings.endGroup(); settings.beginGroup("WebSocketServer"); setWebSocketServerHost(QHostAddress(settings.value("host", "127.0.0.1").toString())); setWebSocketServerPort(static_cast(settings.value("port", 1212).toInt())); settings.endGroup(); settings.beginGroup("TcpServer"); setTcpServerHost(QHostAddress(settings.value("host", "127.0.0.1").toString())); setTcpServerPort(static_cast(settings.value("port", 1213).toInt())); settings.endGroup(); // Load SSL configuration QSslConfiguration sslConfiguration; sslConfiguration.setPeerVerifyMode(QSslSocket::VerifyNone); sslConfiguration.setProtocol(QSsl::TlsV1_2OrLater); // SSL certificate QFile certFile(sslCertificateFileName()); if (!certFile.open(QIODevice::ReadOnly)) { qCWarning(dcApplication()) << "Could not open certificate file" << sslCertificateFileName() << certFile.errorString(); return false; } QSslCertificate certificate(&certFile, QSsl::Pem); qCDebug(dcApplication()) << "Loaded successfully certificate" << sslCertificateFileName(); certFile.close(); sslConfiguration.setLocalCertificate(certificate); // SSL certificate key QFile certKeyFile(sslCertificateKeyFileName()); if (!certKeyFile.open(QIODevice::ReadOnly)) { qCWarning(dcApplication()) << "Could not open certificate key file:" << sslCertificateKeyFileName() << certKeyFile.errorString(); return false; } QSslKey sslKey(&certKeyFile, QSsl::Rsa, QSsl::Pem, QSsl::PrivateKey); qCDebug(dcApplication()) << "Loaded successfully certificate key" << sslCertificateKeyFileName(); certKeyFile.close(); sslConfiguration.setPrivateKey(sslKey); // SSL certificate chain if (!sslCertificateChainFileName().isEmpty()) { QFile certChainFile(sslCertificateChainFileName()); if (!certChainFile.open(QIODevice::ReadOnly)) { qCWarning(dcApplication()) << "Could not open certificate chain file:" << sslCertificateChainFileName() << certChainFile.errorString(); return false; } QSslCertificate certificate(&certChainFile, QSsl::Pem); sslConfiguration.setCaCertificates( QList() << certificate ); certChainFile.close(); qCDebug(dcApplication()) << "Loaded successfully certificate chain" << sslCertificateKeyFileName(); } m_sslConfiguration = sslConfiguration; return true; } QString ProxyConfiguration::fileName() const { return m_fileName; } QString ProxyConfiguration::serverName() const { return m_serverName; } void ProxyConfiguration::setServerName(const QString &serverName) { m_serverName = serverName; } bool ProxyConfiguration::writeLogFile() const { return m_writeLogFile; } void ProxyConfiguration::setWriteLogFile(bool enabled) { m_writeLogFile = enabled; } QString ProxyConfiguration::logFileName() const { return m_logFileName; } void ProxyConfiguration::setLogFileName(const QString &logFileName) { m_logFileName = logFileName; } QString ProxyConfiguration::monitorSocketFileName() const { return m_monitorSocketFileName; } void ProxyConfiguration::setMonitorSocketFileName(const QString &fileName) { m_monitorSocketFileName = fileName; } QString ProxyConfiguration::sslCertificateFileName() const { return m_sslCertificateFileName; } void ProxyConfiguration::setSslCertificateFileName(const QString &fileName) { m_sslCertificateFileName = fileName; } QString ProxyConfiguration::sslCertificateKeyFileName() const { return m_sslCertificateKeyFileName; } void ProxyConfiguration::setSslCertificateKeyFileName(const QString &fileName) { m_sslCertificateKeyFileName = fileName; } QString ProxyConfiguration::sslCertificateChainFileName() const { return m_sslCertificateChainFileName; } void ProxyConfiguration::setSslCertificateChainFileName(const QString &fileName) { m_sslCertificateChainFileName = fileName; } QSslConfiguration ProxyConfiguration::sslConfiguration() const { return m_sslConfiguration; } QHostAddress ProxyConfiguration::webSocketServerHost() const { return m_webSocketServerHost; } void ProxyConfiguration::setWebSocketServerHost(const QHostAddress &address) { m_webSocketServerHost = address; } quint16 ProxyConfiguration::webSocketServerPort() const { return m_webSocketServerPort; } void ProxyConfiguration::setWebSocketServerPort(quint16 port) { m_webSocketServerPort = port; } QHostAddress ProxyConfiguration::tcpServerHost() const { return m_tcpServerHost; } void ProxyConfiguration::setTcpServerHost(const QHostAddress &address) { m_tcpServerHost = address; } quint16 ProxyConfiguration::tcpServerPort() const { return m_tcpServerPort; } void ProxyConfiguration::setTcpServerPort(quint16 port) { m_tcpServerPort = port; } QDebug operator<<(QDebug debug, ProxyConfiguration *configuration) { debug.nospace() << endl << "========== ProxyConfiguration ==========" << endl; debug.nospace() << "Configuration file:" << configuration->fileName() << endl; debug.nospace() << "RemoteProxy configuration" << endl; debug.nospace() << " - Server name:" << configuration->serverName() << endl; debug.nospace() << " - Write logfile:" << configuration->writeLogFile() << endl; debug.nospace() << " - Logfile:" << configuration->logFileName() << endl; debug.nospace() << "SSL configuration" << endl; debug.nospace() << " - Certificate:" << configuration->sslCertificateFileName() << endl; debug.nospace() << " - Certificate key:" << configuration->sslCertificateKeyFileName() << endl; debug.nospace() << " - Certificate chain:" << configuration->sslCertificateChainFileName() << endl; debug.nospace() << " - SSL certificate information:" << endl; debug.nospace() << " Common name:" << configuration->sslConfiguration().localCertificate().subjectInfo(QSslCertificate::CommonName) << endl; debug.nospace() << " Organisation:" << configuration->sslConfiguration().localCertificate().subjectInfo(QSslCertificate::Organization) << endl; debug.nospace() << " Organisation unit name:" << configuration->sslConfiguration().localCertificate().subjectInfo(QSslCertificate::OrganizationalUnitName) << endl; debug.nospace() << " Country name:" << configuration->sslConfiguration().localCertificate().subjectInfo(QSslCertificate::CountryName) << endl; debug.nospace() << " Locality name:" << configuration->sslConfiguration().localCertificate().subjectInfo(QSslCertificate::LocalityName) << endl; debug.nospace() << " State/Province:" << configuration->sslConfiguration().localCertificate().subjectInfo(QSslCertificate::StateOrProvinceName) << endl; debug.nospace() << " Email address:" << configuration->sslConfiguration().localCertificate().subjectInfo(QSslCertificate::EmailAddress) << endl; debug.nospace() << " - SSL certificate issuer information:" << endl; debug.nospace() << " Common name:" << configuration->sslConfiguration().localCertificate().issuerInfo(QSslCertificate::CommonName) << endl; debug.nospace() << " Organisation:" << configuration->sslConfiguration().localCertificate().issuerInfo(QSslCertificate::Organization) << endl; debug.nospace() << " Organisation unit name:" << configuration->sslConfiguration().localCertificate().issuerInfo(QSslCertificate::OrganizationalUnitName) << endl; debug.nospace() << " Country name:" << configuration->sslConfiguration().localCertificate().issuerInfo(QSslCertificate::CountryName) << endl; debug.nospace() << " Locality name:" << configuration->sslConfiguration().localCertificate().issuerInfo(QSslCertificate::LocalityName) << endl; debug.nospace() << " State/Province:" << configuration->sslConfiguration().localCertificate().issuerInfo(QSslCertificate::StateOrProvinceName) << endl; debug.nospace() << " Email address:" << configuration->sslConfiguration().localCertificate().issuerInfo(QSslCertificate::EmailAddress) << endl; debug.nospace() << "WebSocketServer configuration" << endl; debug.nospace() << " - Host:" << configuration->webSocketServerHost().toString() << endl; debug.nospace() << " - Port:" << configuration->webSocketServerPort() << endl; debug.nospace() << "TcpServer" << endl; debug.nospace() << " - Host:" << configuration->tcpServerHost().toString() << endl; debug.nospace() << " - Port:" << configuration->tcpServerPort() << endl; debug.nospace() << "========== ProxyConfiguration =========="; return debug; } }