diff --git a/src/app/application.cpp b/src/app/application.cpp index 9bdb62713..624bcb664 100644 --- a/src/app/application.cpp +++ b/src/app/application.cpp @@ -462,10 +462,10 @@ void Application::cleanup() #ifndef DISABLE_COUNTRIES_RESOLUTION Net::GeoIPManager::freeInstance(); #endif + Net::DownloadManager::freeInstance(); Preferences::freeInstance(); Logger::freeInstance(); IconProvider::freeInstance(); - Net::DownloadManager::freeInstance(); #ifndef DISABLE_GUI #ifdef Q_OS_WIN typedef BOOL (WINAPI *PSHUTDOWNBRDESTROY)(HWND); diff --git a/src/base/net/downloadmanager.cpp b/src/base/net/downloadmanager.cpp index c21fb813a..21672274d 100644 --- a/src/base/net/downloadmanager.cpp +++ b/src/base/net/downloadmanager.cpp @@ -27,11 +27,13 @@ * exception statement from your version. */ +#include #include #include #include #include #include +#include #include #include #include @@ -40,6 +42,71 @@ #include "downloadhandler.h" #include "downloadmanager.h" +namespace +{ + class NetworkCookieJar: public QNetworkCookieJar + { + public: + explicit NetworkCookieJar(QObject *parent = 0) + : QNetworkCookieJar(parent) + { + QDateTime now = QDateTime::currentDateTime(); + QList cookies = Preferences::instance()->getNetworkCookies(); + foreach (const QNetworkCookie &cookie, Preferences::instance()->getNetworkCookies()) { + if (cookie.isSessionCookie() || (cookie.expirationDate() <= now)) + cookies.removeAll(cookie); + } + + setAllCookies(cookies); + } + + ~NetworkCookieJar() + { + QDateTime now = QDateTime::currentDateTime(); + QList cookies = allCookies(); + foreach (const QNetworkCookie &cookie, allCookies()) { + if (cookie.isSessionCookie() || (cookie.expirationDate() <= now)) + cookies.removeAll(cookie); + } + + Preferences::instance()->setNetworkCookies(cookies); + } + +#ifndef QBT_USES_QT5 + virtual bool deleteCookie(const QNetworkCookie &cookie) + { + auto myCookies = allCookies(); + myCookies.removeAll(cookie); + setAllCookies(myCookies); + } +#endif + + QList cookiesForUrl(const QUrl &url) const override + { + QDateTime now = QDateTime::currentDateTime(); + QList cookies = QNetworkCookieJar::cookiesForUrl(url); + foreach (const QNetworkCookie &cookie, QNetworkCookieJar::cookiesForUrl(url)) { + if (!cookie.isSessionCookie() && (cookie.expirationDate() <= now)) + cookies.removeAll(cookie); + } + + return cookies; + } + + bool setCookiesFromUrl(const QList &cookieList, const QUrl &url) override + { + QDateTime now = QDateTime::currentDateTime(); + QList cookies = cookieList; + foreach (const QNetworkCookie &cookie, cookieList) { + if (!cookie.isSessionCookie() && (cookie.expirationDate() <= now)) + cookies.removeAll(cookie); + } + + return QNetworkCookieJar::setCookiesFromUrl(cookies, url); + } + }; +} + using namespace Net; DownloadManager *DownloadManager::m_instance = 0; @@ -50,10 +117,7 @@ DownloadManager::DownloadManager(QObject *parent) #ifndef QT_NO_OPENSSL connect(&m_networkManager, SIGNAL(sslErrors(QNetworkReply *, QList)), this, SLOT(ignoreSslErrors(QNetworkReply *, QList))); #endif -} - -DownloadManager::~DownloadManager() -{ + m_networkManager.setCookieJar(new NetworkCookieJar(this)); } void DownloadManager::initInstance() @@ -92,22 +156,27 @@ DownloadHandler *DownloadManager::downloadUrl(const QString &url, bool saveToFil request.setRawHeader("Referer", request.url().toEncoded().data()); qDebug("Downloading %s...", request.url().toEncoded().data()); + qDebug() << "Cookies:" << m_networkManager.cookieJar()->cookiesForUrl(request.url()); // accept gzip request.setRawHeader("Accept-Encoding", "gzip"); return new DownloadHandler(m_networkManager.get(request), this, saveToFile, limit, handleRedirectToMagnet); } -QList DownloadManager::cookiesForUrl(const QString &url) const +QList DownloadManager::cookiesForUrl(const QUrl &url) const { return m_networkManager.cookieJar()->cookiesForUrl(url); } bool DownloadManager::setCookiesFromUrl(const QList &cookieList, const QUrl &url) { - qDebug("Setting %d cookies for url: %s", cookieList.size(), qPrintable(url.toString())); return m_networkManager.cookieJar()->setCookiesFromUrl(cookieList, url); } +bool DownloadManager::deleteCookie(const QNetworkCookie &cookie) +{ + return static_cast(m_networkManager.cookieJar())->deleteCookie(cookie); +} + void DownloadManager::applyProxySettings() { QNetworkProxy proxy; diff --git a/src/base/net/downloadmanager.h b/src/base/net/downloadmanager.h index d5fe6b367..8621f70bd 100644 --- a/src/base/net/downloadmanager.h +++ b/src/base/net/downloadmanager.h @@ -33,12 +33,10 @@ #include #include -QT_BEGIN_NAMESPACE class QNetworkReply; class QNetworkCookie; class QSslError; class QUrl; -QT_END_NAMESPACE namespace Net { @@ -54,8 +52,9 @@ namespace Net static DownloadManager *instance(); DownloadHandler *downloadUrl(const QString &url, bool saveToFile = false, qint64 limit = 0, bool handleRedirectToMagnet = false); - QList cookiesForUrl(const QString &url) const; + QList cookiesForUrl(const QUrl &url) const; bool setCookiesFromUrl(const QList &cookieList, const QUrl &url); + bool deleteCookie(const QNetworkCookie &cookie); private slots: #ifndef QT_NO_OPENSSL @@ -63,8 +62,7 @@ namespace Net #endif private: - DownloadManager(QObject *parent = 0); - ~DownloadManager(); + explicit DownloadManager(QObject *parent = 0); void applyProxySettings(); diff --git a/src/base/preferences.cpp b/src/base/preferences.cpp index 590039380..783fcc6a9 100644 --- a/src/base/preferences.cpp +++ b/src/base/preferences.cpp @@ -1027,12 +1027,12 @@ void Preferences::setFilteringEnabled(bool enabled) bool Preferences::isFilteringTrackerEnabled() const { - return value("Preferences/IPFilter/FilterTracker", false).toBool(); + return value("Preferences/IPFilter/FilterTracker", false).toBool(); } void Preferences::setFilteringTrackerEnabled(bool enabled) { - setValue("Preferences/IPFilter/FilterTracker", enabled); + setValue("Preferences/IPFilter/FilterTracker", enabled); } QString Preferences::getFilter() const @@ -2559,11 +2559,32 @@ void Preferences::setHostNameCookies(const QString &host_name, const QList Preferences::getNetworkCookies() const +{ + QList cookies; + QStringList rawCookies = value("Network/Cookies").toStringList(); + foreach (const QString &rawCookie, rawCookies) + cookies << QNetworkCookie::parseCookies(rawCookie.toUtf8()); + + return cookies; +} + +void Preferences::setNetworkCookies(const QList &cookies) +{ + QStringList rawCookies; + foreach (const QNetworkCookie &cookie, cookies) + rawCookies << cookie.toRawForm(); + + setValue("Network/Cookies", rawCookies); +} + +int Preferences::getSpeedWidgetPeriod() const +{ return value("SpeedWidget/period", 1).toInt(); } -void Preferences::setSpeedWidgetPeriod(const int period) { +void Preferences::setSpeedWidgetPeriod(const int period) +{ setValue("SpeedWidget/period", period); } diff --git a/src/base/preferences.h b/src/base/preferences.h index 4767a1d59..96fe22fb7 100644 --- a/src/base/preferences.h +++ b/src/base/preferences.h @@ -542,6 +542,10 @@ public: QList getHostNameQNetworkCookies(const QString& host_name) const; void setHostNameCookies(const QString &host_name, const QList &cookies); + // Network + QList getNetworkCookies() const; + void setNetworkCookies(const QList &cookies); + // SpeedWidget int getSpeedWidgetPeriod() const; void setSpeedWidgetPeriod(const int period);