diff --git a/widgets/webview/webpage.cpp b/widgets/webview/webpage.cpp index e8985ad..fd0fdac 100644 --- a/widgets/webview/webpage.cpp +++ b/widgets/webview/webpage.cpp @@ -18,7 +18,6 @@ #include #include #include -#include #elif defined(SYNCTHINGWIDGETS_USE_WEBKIT) #include #include @@ -47,6 +46,9 @@ WebPage::WebPage(WebViewDialog *dlg, SYNCTHINGWIDGETS_WEB_VIEW *view) { #ifdef SYNCTHINGWIDGETS_USE_WEBENGINE settings()->setAttribute(QWebEngineSettings::JavascriptCanOpenWindows, true); +#if (QTWEBENGINEWIDGETS_VERSION >= QT_VERSION_CHECK(6, 0, 0)) + connect(this, &WebPage::certificateError, this, &WebPage::handleCertificateError); +#endif connect( this, &WebPage::authenticationRequired, this, static_cast(&WebPage::supplyCredentials)); #else // SYNCTHINGWIDGETS_USE_WEBKIT @@ -101,14 +103,16 @@ SYNCTHINGWIDGETS_WEB_PAGE *WebPage::createWindow(SYNCTHINGWIDGETS_WEB_PAGE::WebW } #ifdef SYNCTHINGWIDGETS_USE_WEBENGINE -/*! - * \brief Accepts self-signed certificates used by the Syncthing GUI as configured. - * \remarks Before Qt 5.14 any self-signed certificates are accepted. - */ -bool WebPage::certificateError(const QWebEngineCertificateError &certificateError) +bool WebPage::canIgnoreCertificateError(const QWebEngineCertificateError &certificateError) const { // never ignore errors other than CertificateCommonNameInvalid and CertificateAuthorityInvalid - switch (certificateError.error()) { + switch (certificateError +#if (QTWEBENGINEWIDGETS_VERSION >= QT_VERSION_CHECK(6, 0, 0)) + .type() +#else + .error() +#endif + ) { case QWebEngineCertificateError::CertificateCommonNameInvalid: case QWebEngineCertificateError::CertificateAuthorityInvalid: break; @@ -148,6 +152,31 @@ bool WebPage::certificateError(const QWebEngineCertificateError &certificateErro return true; } +/*! + * \brief Accepts self-signed certificates used by the Syncthing GUI as configured. + * \remarks + * - Before Qt 5.14 any self-signed certificates are accepted. + * - The const_cast used in the Qt 6 version is most likely wrong and not how to the API is + * supposed to be used. The [documentation](https://doc-snapshots.qt.io/qt6-dev/qwebenginepage.html#certificateError) + * mentions one is able to ignore certificate errors but does not state how. + */ +#if (QTWEBENGINEWIDGETS_VERSION >= QT_VERSION_CHECK(6, 0, 0)) +void WebPage::handleCertificateError(const QWebEngineCertificateError &certificateError) +{ + auto &error = const_cast(certificateError); + if (canIgnoreCertificateError(certificateError)) { + error.acceptCertificate(); + } else { + error.rejectCertificate(); + } +} +#else +bool WebPage::certificateError(const QWebEngineCertificateError &certificateError) +{ + return canIgnoreCertificateError(certificateError); +} +#endif + /*! * \brief Accepts navigation requests only on the same page. */ diff --git a/widgets/webview/webpage.h b/widgets/webview/webpage.h index daba687..75a2594 100644 --- a/widgets/webview/webpage.h +++ b/widgets/webview/webpage.h @@ -30,11 +30,13 @@ public: protected: SYNCTHINGWIDGETS_WEB_PAGE *createWindow(WebWindowType type) override; #ifdef SYNCTHINGWIDGETS_USE_WEBENGINE - bool certificateError(const QWebEngineCertificateError &certificateError) override; +#if (QTWEBENGINEWIDGETS_VERSION < QT_VERSION_CHECK(6, 0, 0)) + bool certificateError(const QWebEngineCertificateError &certificateError) override; // signal in Qt >= 6 +#endif bool acceptNavigationRequest(const QUrl &url, NavigationType type, bool isMainFrame) override; void javaScriptConsoleMessage( QWebEnginePage::JavaScriptConsoleMessageLevel level, const QString &message, int lineNumber, const QString &sourceID) override; -#else +#else // SYNCTHINGWIDGETS_USE_WEBKIT bool acceptNavigationRequest(QWebFrame *frame, const QNetworkRequest &request, NavigationType type) override; void javaScriptConsoleMessage(const QString &message, int lineNumber, const QString &sourceID) override; #endif @@ -44,7 +46,11 @@ private Q_SLOTS: void supplyCredentials(const QUrl &requestUrl, QAuthenticator *authenticator); void supplyCredentials(QNetworkReply *reply, QAuthenticator *authenticator); void supplyCredentials(QAuthenticator *authenticator); -#ifdef SYNCTHINGWIDGETS_USE_WEBKIT +#ifdef SYNCTHINGWIDGETS_USE_WEBENGINE +#if (QTWEBENGINEWIDGETS_VERSION >= QT_VERSION_CHECK(6, 0, 0)) + void handleCertificateError(const QWebEngineCertificateError &certificateError); +#endif +#else // SYNCTHINGWIDGETS_USE_WEBKIT void handleSslErrors(QNetworkReply *, const QList &errors); #endif void injectJavaScripts(bool ok); @@ -53,6 +59,9 @@ private Q_SLOTS: void showFolderPathSelection(const QString &defaultDir); private: +#ifdef SYNCTHINGWIDGETS_USE_WEBENGINE + bool canIgnoreCertificateError(const QWebEngineCertificateError &certificateError) const; +#endif static bool handleNavigationRequest(const QUrl ¤tUrl, const QUrl &url); WebViewDialog *m_dlg; diff --git a/widgets/webview/webviewincludes.h b/widgets/webview/webviewincludes.h index 626c3f7..a0b4ce7 100644 --- a/widgets/webview/webviewincludes.h +++ b/widgets/webview/webviewincludes.h @@ -9,6 +9,7 @@ #if defined(SYNCTHINGWIDGETS_USE_WEBENGINE) # include # include +# include #elif defined(SYNCTHINGWIDGETS_USE_WEBKIT) # include # include