aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/help/webenginehelpviewer.cpp
diff options
context:
space:
mode:
authorEike Ziller <[email protected]>2019-09-13 15:18:02 +0200
committerEike Ziller <[email protected]>2019-09-16 11:34:23 +0000
commit8d3e4c03f0e27b096c34326abfd357387f963537 (patch)
tree0dc052c092ad3e984d6658c2ee084662b96f24e1 /src/plugins/help/webenginehelpviewer.cpp
parent6b31f9cf23cac79c10a9871961e3de79be657b38 (diff)
Help/QtWebEngine: Prevent remote content
Showing remote content adds security implications Change-Id: I0b5672d9c814b55aca05ea8a28da4f5e0e9f42fd Reviewed-by: hjk <[email protected]>
Diffstat (limited to 'src/plugins/help/webenginehelpviewer.cpp')
-rw-r--r--src/plugins/help/webenginehelpviewer.cpp49
1 files changed, 46 insertions, 3 deletions
diff --git a/src/plugins/help/webenginehelpviewer.cpp b/src/plugins/help/webenginehelpviewer.cpp
index 197f356d79e..736d4e69029 100644
--- a/src/plugins/help/webenginehelpviewer.cpp
+++ b/src/plugins/help/webenginehelpviewer.cpp
@@ -34,6 +34,7 @@
#include <QBuffer>
#include <QContextMenuEvent>
#include <QCoreApplication>
+#include <QDesktopServices>
#include <QTimer>
#include <QVBoxLayout>
#include <QWebEngineContextMenuData>
@@ -72,10 +73,40 @@ static HelpUrlSchemeHandler *helpUrlSchemeHandler()
return schemeHandler;
}
+HelpUrlRequestInterceptor::HelpUrlRequestInterceptor(QObject *parent)
+ : QWebEngineUrlRequestInterceptor(parent)
+{}
+
+void HelpUrlRequestInterceptor::interceptRequest(QWebEngineUrlRequestInfo &info)
+{
+ if (!HelpViewer::isLocalUrl(info.requestUrl())
+ && info.navigationType() != QWebEngineUrlRequestInfo::NavigationTypeLink) {
+ info.block(true);
+ }
+}
+
+static HelpUrlRequestInterceptor *helpurlRequestInterceptor()
+{
+ static HelpUrlRequestInterceptor *interceptor = nullptr;
+ if (!interceptor)
+ interceptor = new HelpUrlRequestInterceptor(LocalHelpManager::instance());
+ return interceptor;
+}
+
WebEngineHelpViewer::WebEngineHelpViewer(QWidget *parent) :
HelpViewer(parent),
m_widget(new WebView(this))
{
+ // some of these should already be that way by default, but better be sure
+ QWebEngineSettings *settings = m_widget->settings();
+ settings->setAttribute(QWebEngineSettings::JavascriptCanOpenWindows, false);
+ settings->setAttribute(QWebEngineSettings::LocalContentCanAccessRemoteUrls, false);
+ settings->setAttribute(QWebEngineSettings::XSSAuditingEnabled, true);
+ settings->setAttribute(QWebEngineSettings::PluginsEnabled, false);
+ settings->setAttribute(QWebEngineSettings::AllowRunningInsecureContent, false);
+ settings->setAttribute(QWebEngineSettings::AllowGeolocationOnInsecureOrigins, false);
+ settings->setAttribute(QWebEngineSettings::AllowWindowActivationFromJavaScript, false);
+
m_widget->setPage(new WebEngineHelpPage(this));
auto layout = new QVBoxLayout;
setLayout(layout);
@@ -121,6 +152,7 @@ WebEngineHelpViewer::WebEngineHelpViewer(QWidget *parent) :
QTC_ASSERT(viewProfile, return);
if (!viewProfile->urlSchemeHandler("qthelp"))
viewProfile->installUrlSchemeHandler("qthelp", helpUrlSchemeHandler());
+ viewProfile->setUrlRequestInterceptor(helpurlRequestInterceptor());
}
QFont WebEngineHelpViewer::viewerFont() const
@@ -286,12 +318,23 @@ WebEngineHelpPage::WebEngineHelpPage(QObject *parent)
{
}
-WebView::WebView(WebEngineHelpViewer *viewer)
- : QWebEngineView(viewer),
- m_viewer(viewer)
+bool WebEngineHelpPage::acceptNavigationRequest(const QUrl &url,
+ QWebEnginePage::NavigationType type,
+ bool isMainFrame)
{
+ Q_UNUSED(type)
+ Q_UNUSED(isMainFrame)
+ if (HelpViewer::isLocalUrl(url))
+ return true;
+ QDesktopServices::openUrl(url);
+ return false;
}
+WebView::WebView(WebEngineHelpViewer *viewer)
+ : QWebEngineView(viewer)
+ , m_viewer(viewer)
+{}
+
bool WebView::event(QEvent *ev)
{
// work around QTBUG-43602