From 3efd427d2a6c456f1cfbdd73013d8e20cac909ab Mon Sep 17 00:00:00 2001 From: Aqua-sama Date: Sat, 13 Jan 2018 20:13:10 +0100 Subject: CookieInterceptor, making all cookies session cookies --- BUGS.md | 45 ++----------------------------------- CMakeLists.txt | 2 ++ src/browser.cpp | 3 ++- src/browser.h | 2 ++ src/webengine/cookieinterceptor.cpp | 34 ++++++++++++++++++++++++++++ src/webengine/cookieinterceptor.h | 32 ++++++++++++++++++++++++++ src/webengine/webengineprofile.cpp | 7 ++++++ src/webengine/webengineprofile.h | 3 +++ 8 files changed, 84 insertions(+), 44 deletions(-) create mode 100644 src/webengine/cookieinterceptor.cpp create mode 100644 src/webengine/cookieinterceptor.h diff --git a/BUGS.md b/BUGS.md index 03eee94..df2d942 100644 --- a/BUGS.md +++ b/BUGS.md @@ -2,52 +2,11 @@ List of known bugs that can't be fixed atm ### Search terms in address bar -QUrl always seems to return true when checking if valid url. Workaround is to prepend '#' -to the search. +QUrl always seems to return true when checking if valid url. Workaround is to +prepend '#' to the search. ### databases-incognito in home https://bugreports.qt.io/browse/QTBUG-62957 ### Shortcuts don't work at times A field on a page is probably taking focus. - -## To do list -List of things to do before 1.0 release - -### Cookies -- cookie whitelist and blacklist - -### Request filter -- How are multiple IPs per hostname to be treated? -- Multiple hostnames on a line get ignored after the first one - -### Settings dialog -- show settings dialog on startup if config was auto-generated -- dialog buttons - -### Bookmarks -- BUG: Completer doesn't search through folders -- TODO: BookmarkItem icon url -- TOOD: Saving BookmarksModel - -### Downloads -- review code -- download speed -- Elapsed time, avg speed, remaining time -- In details: stop, pause/resume - -### Rewrite documentation -- quickstart/manual that lists keyboard shortcuts - -### SSL popup -- give it a proper size (perhaps instead of a QMenu, make it a QWidget) - -### Windows build -- adjust paths to make sense on Windows -- make sure smolbote can run independent of its location - -Appveyor offers free builds for OSS; the build image offers Qt 5.9.2 with msvc2017 -- compile libconfig -- compile smolbote, and link to libconfig -- windeployqt into a package -- write blog post about the process diff --git a/CMakeLists.txt b/CMakeLists.txt index 0fd5850..e7c7296 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -79,6 +79,8 @@ set(SourceCode "data/resources.qrc" # webengine + src/webengine/cookieinterceptor.cpp + src/webengine/cookieinterceptor.h "src/webengine/urlinterceptor.cpp" "src/webengine/urlinterceptor.h" "src/webengine/webengineprofile.cpp" # todo: rename to profile diff --git a/src/browser.cpp b/src/browser.cpp index 25fcf59..8b7f40f 100644 --- a/src/browser.cpp +++ b/src/browser.cpp @@ -9,7 +9,6 @@ #include "browser.h" #include "mainwindow.h" #include "webengine/urlinterceptor.h" -#include #include #include #include @@ -45,6 +44,7 @@ void Browser::setConfiguration(std::shared_ptr &config) m_downloadManager = std::make_shared(QString::fromStdString(m_config->value("downloads.path").value())); m_urlRequestInterceptor = std::make_shared(QString::fromStdString(m_config->value("filter.path").value())); + m_cookieInterceptor = std::make_shared(""); // set default profile m_defaultProfile = profile(QString::fromStdString(m_config->value("browser.profile").value())); @@ -118,6 +118,7 @@ std::shared_ptr Browser::profile(const QString storageName) const QString &path = QString::fromStdString(m_config->value("profile.path").value()); std::shared_ptr _profile = std::shared_ptr(createProfile(storageName, path, nullptr)); _profile->setRequestInterceptor(m_urlRequestInterceptor.get()); + _profile->setCookieInterceptor(m_cookieInterceptor.get()); connect(_profile.get(), &WebEngineProfile::downloadRequested, m_downloadManager.get(), &DownloadsWidget::addDownload); m_profiles.insert(storageName, _profile); diff --git a/src/browser.h b/src/browser.h index a78219d..9649948 100644 --- a/src/browser.h +++ b/src/browser.h @@ -14,6 +14,7 @@ #include "webengine/webengineprofile.h" #include #include +#include "webengine/cookieinterceptor.h" class MainWindow; class BookmarksWidget; @@ -46,6 +47,7 @@ private: std::shared_ptr m_defaultProfile; std::shared_ptr m_urlRequestInterceptor; + std::shared_ptr m_cookieInterceptor; std::shared_ptr m_bookmarksManager; std::shared_ptr m_downloadManager; }; diff --git a/src/webengine/cookieinterceptor.cpp b/src/webengine/cookieinterceptor.cpp new file mode 100644 index 0000000..88cc475 --- /dev/null +++ b/src/webengine/cookieinterceptor.cpp @@ -0,0 +1,34 @@ +/* + * This file is part of smolbote. It's copyrighted by the contributors recorded + * in the version control history of the file, available from its original + * location: git://neueland.iserlohn-fortress.net/smolbote.git + * + * SPDX-License-Identifier: GPL-3.0 + */ + +#include "cookieinterceptor.h" +#include +#include + +CookieInterceptor::CookieInterceptor(const QString &path, QObject *parent) + : QObject(parent) +{ +} + +void CookieInterceptor::judgeCookie(const QNetworkCookie &cookie) { + QWebEngineCookieStore *store = dynamic_cast(sender()); + Q_CHECK_PTR(store); + + qDebug("Added cookie %s::%s", qUtf8Printable(cookie.domain()), qUtf8Printable(cookie.name())); + + // A session cookie is a cookie which has no expiration date, which means it should be discarded when + // the application's concept of session is over (usually, when the application exits) + if(!cookie.isSessionCookie()) { + QNetworkCookie copyCookie(cookie); + copyCookie.setExpirationDate(QDateTime::fromString("")); + qDebug("cookie is now session?: %s", copyCookie.isSessionCookie() ? "yes" : "no"); + + store->deleteCookie(cookie, cookie.domain()); + store->setCookie(copyCookie, copyCookie.domain()); + } +} diff --git a/src/webengine/cookieinterceptor.h b/src/webengine/cookieinterceptor.h new file mode 100644 index 0000000..58b8894 --- /dev/null +++ b/src/webengine/cookieinterceptor.h @@ -0,0 +1,32 @@ +/* + * This file is part of smolbote. It's copyrighted by the contributors recorded + * in the version control history of the file, available from its original + * location: git://neueland.iserlohn-fortress.net/smolbote.git + * + * SPDX-License-Identifier: GPL-3.0 + */ + +#ifndef COOKIEINTERCEPTOR_H +#define COOKIEINTERCEPTOR_H + +#include +#include + +class CookieInterceptor : public QObject +{ + Q_OBJECT + +public: + struct CookieRule { + bool isBlocking; + }; + + explicit CookieInterceptor(const QString &path, QObject *parent = nullptr); + +public slots: + void judgeCookie(const QNetworkCookie &cookie); + +private: +}; + +#endif //COOKIEINTERCEPTOR_H diff --git a/src/webengine/webengineprofile.cpp b/src/webengine/webengineprofile.cpp index 78f0b9a..0e6a6bd 100644 --- a/src/webengine/webengineprofile.cpp +++ b/src/webengine/webengineprofile.cpp @@ -9,6 +9,7 @@ #include "webengineprofile.h" #include #include +#include #include WebEngineProfile::WebEngineProfile(QObject *parent) @@ -138,6 +139,12 @@ void WebEngineProfile::saveProfile() config.sync(); } +void WebEngineProfile::setCookieInterceptor(CookieInterceptor *interceptor) +{ + connect(cookieStore(), &QWebEngineCookieStore::cookieAdded, interceptor, &CookieInterceptor::judgeCookie); + cookieStore()->loadAllCookies(); +} + WebEngineProfile *createProfile(const QString &name, const QString &path, QObject *parent) { WebEngineProfile *profile; diff --git a/src/webengine/webengineprofile.h b/src/webengine/webengineprofile.h index bcf21bc..d0e5ed9 100644 --- a/src/webengine/webengineprofile.h +++ b/src/webengine/webengineprofile.h @@ -11,6 +11,7 @@ #include #include +#include "cookieinterceptor.h" class WebEngineProfile : public QWebEngineProfile { @@ -29,6 +30,8 @@ public: QUrl newtab() const; void setNewtab(const QUrl &url); + void setCookieInterceptor(CookieInterceptor *interceptor); + signals: public slots: -- cgit v1.2.1