diff --git a/src/plugins/axivion/axivionplugin.cpp b/src/plugins/axivion/axivionplugin.cpp index 35404e81c06..0c09ecb475d 100644 --- a/src/plugins/axivion/axivionplugin.cpp +++ b/src/plugins/axivion/axivionplugin.cpp @@ -7,12 +7,14 @@ #include "axivionprojectsettings.h" #include "axivionquery.h" #include "axivionresultparser.h" +#include "axivionsettings.h" #include "axiviontr.h" #include "dashboard/dashboardclient.h" #include "dashboard/dto.h" #include #include +#include #include #include @@ -26,6 +28,7 @@ #include #include +#include #include #include #include @@ -33,6 +36,9 @@ #include #include +#include +#include +#include #include #include @@ -45,6 +51,8 @@ namespace Axivion::Internal { class AxivionPluginPrivate : public QObject { public: + AxivionPluginPrivate(); + void handleSslErrors(QNetworkReply *reply, const QList &errors); void onStartupProjectChanged(); void fetchProjectInfo(const QString &projectName); void handleProjectInfo(DashboardClient::RawProjectInfo rawInfo); @@ -55,7 +63,7 @@ public: void handleIssuesForFile(const IssuesList &issues); void fetchRuleInfo(const QString &id); - Utils::NetworkAccessManager *m_networkAccessManager = Utils::NetworkAccessManager::instance(); + Utils::NetworkAccessManager m_networkAccessManager; AxivionOutputPane m_axivionOutputPane; std::shared_ptr m_currentProjectInfo; bool m_runningQuery = false; @@ -128,6 +136,46 @@ std::shared_ptr AxivionPlugin::projectInfo() return dd->m_currentProjectInfo; } +// FIXME: extend to give some details? +// FIXME: move when curl is no more in use? +bool AxivionPlugin::handleCertificateIssue() +{ + QTC_ASSERT(dd, return false); + const QString serverHost = QUrl(settings().server.dashboard).host(); + if (QMessageBox::question(Core::ICore::dialogParent(), Tr::tr("Certificate Error"), + Tr::tr("Server certificate for %1 cannot be authenticated.\n" + "Do you want to disable SSL verification for this server?\n" + "Note: This can expose you to man-in-the-middle attack.") + .arg(serverHost)) + != QMessageBox::Yes) { + return false; + } + settings().server.validateCert = false; + settings().apply(); + + return true; +} + +AxivionPluginPrivate::AxivionPluginPrivate() +{ + connect(&m_networkAccessManager, &QNetworkAccessManager::sslErrors, + this, &AxivionPluginPrivate::handleSslErrors); +} + +void AxivionPluginPrivate::handleSslErrors(QNetworkReply *reply, const QList &errors) +{ + const QList accepted{ + QSslError::CertificateNotYetValid, QSslError::CertificateExpired, + QSslError::InvalidCaCertificate, QSslError::CertificateUntrusted, + QSslError::HostNameMismatch + }; + if (Utils::allOf(errors, + [&accepted](const QSslError &e) { return accepted.contains(e.error()); })) { + if (!settings().server.validateCert || AxivionPlugin::handleCertificateIssue()) + reply->ignoreSslErrors(errors); + } +} + void AxivionPluginPrivate::onStartupProjectChanged() { ProjectExplorer::Project *project = ProjectExplorer::ProjectManager::startupProject(); @@ -155,7 +203,7 @@ void AxivionPluginPrivate::fetchProjectInfo(const QString &projectName) return; } m_runningQuery = true; - DashboardClient client { *this->m_networkAccessManager }; + DashboardClient client { this->m_networkAccessManager }; QFuture response = client.fetchProjectInfo(projectName); auto responseWatcher = std::make_shared>(); connect(responseWatcher.get(), diff --git a/src/plugins/axivion/axivionplugin.h b/src/plugins/axivion/axivionplugin.h index 0d072dab236..380b8630f61 100644 --- a/src/plugins/axivion/axivionplugin.h +++ b/src/plugins/axivion/axivionplugin.h @@ -27,6 +27,7 @@ public: static void fetchProjectInfo(const QString &projectName); static std::shared_ptr projectInfo(); + static bool handleCertificateIssue(); private: void initialize() final; diff --git a/src/plugins/axivion/axivionquery.cpp b/src/plugins/axivion/axivionquery.cpp index b701c921371..13f18229087 100644 --- a/src/plugins/axivion/axivionquery.cpp +++ b/src/plugins/axivion/axivionquery.cpp @@ -5,14 +5,10 @@ #include "axivionplugin.h" #include "axivionsettings.h" -#include "axiviontr.h" - -#include #include #include -#include #include using namespace Utils; @@ -54,23 +50,6 @@ QString AxivionQuery::toString() const return {}; } -static bool handleCertificateIssue() -{ - const QString serverHost = QUrl(settings().server.dashboard).host(); - if (QMessageBox::question(Core::ICore::dialogParent(), Tr::tr("Certificate Error"), - Tr::tr("Server certificate for %1 cannot be authenticated.\n" - "Do you want to disable SSL verification for this server?\n" - "Note: This can expose you to man-in-the-middle attack.") - .arg(serverHost)) - != QMessageBox::Yes) { - return false; - } - settings().server.validateCert = false; - settings().apply(); - - return true; -} - AxivionQueryRunner::AxivionQueryRunner(const AxivionQuery &query, QObject *parent) : QObject(parent) { @@ -91,7 +70,7 @@ AxivionQueryRunner::AxivionQueryRunner(const AxivionQuery &query, QObject *paren const int exitCode = m_process.exitCode(); if (m_process.exitStatus() == QProcess::NormalExit && (exitCode == 35 || exitCode == 60) - && handleCertificateIssue()) { + && AxivionPlugin::handleCertificateIssue()) { // prepend -k for re-requesting same query CommandLine cmdline = m_process.commandLine(); cmdline.prependArgs({"-k"});