From 66aff30221245a97f36bcc8b5441c7c87fa56e9b Mon Sep 17 00:00:00 2001 From: Oleg Shparber Date: Sun, 2 Aug 2020 20:36:56 -0400 Subject: [PATCH] feat(browser): restore custom request interceptor This enables blocking of external resources in docsets. The original implementation of the request interceptor was temporary removed in 373606a1ede173a0e8037ab46af0acf68ab60594. --- src/libs/browser/CMakeLists.txt | 1 + src/libs/browser/settings.cpp | 9 +++ src/libs/browser/urlrequestinterceptor.cpp | 74 ++++++++++++++++++++++ src/libs/browser/urlrequestinterceptor.h | 47 ++++++++++++++ 4 files changed, 131 insertions(+) create mode 100644 src/libs/browser/urlrequestinterceptor.cpp create mode 100644 src/libs/browser/urlrequestinterceptor.h diff --git a/src/libs/browser/CMakeLists.txt b/src/libs/browser/CMakeLists.txt index f69c629..4d94acc 100644 --- a/src/libs/browser/CMakeLists.txt +++ b/src/libs/browser/CMakeLists.txt @@ -1,6 +1,7 @@ add_library(Browser STATIC searchtoolbar.cpp settings.cpp + urlrequestinterceptor.cpp webbridge.cpp webcontrol.cpp webpage.cpp diff --git a/src/libs/browser/settings.cpp b/src/libs/browser/settings.cpp index 7ed2af7..4fd151c 100644 --- a/src/libs/browser/settings.cpp +++ b/src/libs/browser/settings.cpp @@ -22,6 +22,8 @@ #include "settings.h" +#include "urlrequestinterceptor.h" + #include #include @@ -49,6 +51,13 @@ Settings::Settings(Core::Settings *appSettings, QObject *parent) // Create a new off-the-record profile. m_webProfile = new QWebEngineProfile(this); + // Setup URL interceptor. +#if QT_VERSION >= QT_VERSION_CHECK(5, 13, 0) + m_webProfile->setUrlRequestInterceptor(new UrlRequestInterceptor(this)); +#else + m_webProfile->setRequestInterceptor(new UrlRequestInterceptor(this)); +#endif + // Listen to settings changes. connect(m_appSettings, &Core::Settings::updated, this, &Settings::applySettings); applySettings(); diff --git a/src/libs/browser/urlrequestinterceptor.cpp b/src/libs/browser/urlrequestinterceptor.cpp new file mode 100644 index 0000000..49c4e12 --- /dev/null +++ b/src/libs/browser/urlrequestinterceptor.cpp @@ -0,0 +1,74 @@ +/**************************************************************************** +** +** Copyright (C) 2020 Oleg Shparber +** Copyright (C) 2019 Kay Gawlik +** Contact: https://go.zealdocs.org/l/contact +** +** This file is part of Zeal. +** +** Zeal is free software: you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation, either version 3 of the License, or +** (at your option) any later version. +** +** Zeal is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with Zeal. If not, see . +** +****************************************************************************/ + +#include "urlrequestinterceptor.h" + +#include + +#include + +using namespace Zeal::Browser; + +static Q_LOGGING_CATEGORY(log, "zeal.browser.urlrequestinterceptor") + +UrlRequestInterceptor::UrlRequestInterceptor(QObject *parent) + : QWebEngineUrlRequestInterceptor(parent) +{ +} + +void UrlRequestInterceptor::interceptRequest(QWebEngineUrlRequestInfo &info) +{ + const QUrl requestUrl = info.requestUrl(); + const QUrl firstPartyUrl = info.firstPartyUrl(); + + // Block invalid requests. + if (!requestUrl.isValid() || !firstPartyUrl.isValid()) { + blockRequest(info); + return; + } + + bool isFirstPartyUrlLocal = Core::NetworkAccessManager::isLocalUrl(firstPartyUrl); + bool isRequestUrlLocal = Core::NetworkAccessManager::isLocalUrl(requestUrl); + + // Direct links are controlled in the WebPage + if (info.resourceType() == QWebEngineUrlRequestInfo::ResourceTypeMainFrame) { + return; + } + + // Allow local resources on local pages and external resources on external pages. + if (isFirstPartyUrlLocal == isRequestUrlLocal) { + return; + } + + blockRequest(info); +} + +void UrlRequestInterceptor::blockRequest(QWebEngineUrlRequestInfo &info) +{ + qCDebug(log, "Blocked request: %s '%s' (resource_type=%d, navigation_type=%d).", + info.requestMethod().data(), + qPrintable(info.requestUrl().toString()), + info.resourceType(), info.navigationType()); + + info.block(true); +} diff --git a/src/libs/browser/urlrequestinterceptor.h b/src/libs/browser/urlrequestinterceptor.h new file mode 100644 index 0000000..72be71c --- /dev/null +++ b/src/libs/browser/urlrequestinterceptor.h @@ -0,0 +1,47 @@ +/**************************************************************************** +** +** Copyright (C) 2020 Oleg Shparber +** Copyright (C) 2019 Kay Gawlik +** Contact: https://go.zealdocs.org/l/contact +** +** This file is part of Zeal. +** +** Zeal is free software: you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation, either version 3 of the License, or +** (at your option) any later version. +** +** Zeal is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with Zeal. If not, see . +** +****************************************************************************/ + +#ifndef ZEAL_BROWSER_URLREQUESTINTERCEPTOR_H +#define ZEAL_BROWSER_URLREQUESTINTERCEPTOR_H + +#include + +namespace Zeal { +namespace Browser { + +class UrlRequestInterceptor final : public QWebEngineUrlRequestInterceptor +{ + Q_OBJECT + Q_DISABLE_COPY(UrlRequestInterceptor) +public: + UrlRequestInterceptor(QObject *parent = nullptr); + void interceptRequest(QWebEngineUrlRequestInfo &info) override; + +private: + void blockRequest(QWebEngineUrlRequestInfo &info); +}; + +} // namespace Browser +} // namespace Zeal + +#endif // ZEAL_BROWSER_URLREQUESTINTERCEPTOR_H