diff --git a/src/app/upgrade.h b/src/app/upgrade.h index 0a9ff75c8..1f6366210 100644 --- a/src/app/upgrade.h +++ b/src/app/upgrade.h @@ -45,6 +45,7 @@ #include "base/utils/misc.h" #include "base/utils/string.h" #include "base/qinisettings.h" +#include "base/preferences.h" bool userAcceptsUpgrade() { @@ -114,6 +115,9 @@ bool upgradeResumeFile(const QString &filepath, const QVariantHash &oldTorrent, bool upgrade(bool ask = true) { + // Move RSS cookies to common storage + Preferences::instance()->moveRSSCookies(); + QIniSettings *oldResumeSettings = new QIniSettings("qBittorrent", "qBittorrent-resume"); QString oldResumeFilename = oldResumeSettings->fileName(); QVariantHash oldResumeData = oldResumeSettings->value("torrents").toHash(); diff --git a/src/base/preferences.cpp b/src/base/preferences.cpp index 783fcc6a9..9aab3ad9b 100644 --- a/src/base/preferences.cpp +++ b/src/base/preferences.cpp @@ -2525,38 +2525,29 @@ void Preferences::setToolbarTextPosition(const int position) setValue("Toolbar/textPosition", position); } -QList Preferences::getHostNameCookies(const QString &host_name) const +void Preferences::moveRSSCookies() { - QMap hosts_table = value("Rss/hosts_cookies").toMap(); - if (!hosts_table.contains(host_name)) return QList(); - QByteArray raw_cookies = hosts_table.value(host_name).toByteArray(); - return raw_cookies.split(':'); -} - -QList Preferences::getHostNameQNetworkCookies(const QString& host_name) const -{ - QList cookies; - const QList raw_cookies = getHostNameCookies(host_name); - foreach (const QByteArray& raw_cookie, raw_cookies) { - QList cookie_parts = raw_cookie.split('='); - if (cookie_parts.size() == 2) { - qDebug("Loading cookie: %s = %s", cookie_parts.first().constData(), cookie_parts.last().constData()); - cookies << QNetworkCookie(cookie_parts.first(), cookie_parts.last()); + QList cookies = getNetworkCookies(); + QVariantMap hostsTable = value("Rss/hosts_cookies").toMap(); + foreach (const QString &key, hostsTable.keys()) { + QVariant value = hostsTable[key]; + QList rawCookies = value.toByteArray().split(':'); + foreach (const QByteArray &rawCookie, rawCookies) { + foreach (QNetworkCookie cookie, QNetworkCookie::parseCookies(rawCookie)) { + cookie.setDomain(key); + cookie.setPath("/"); + cookie.setExpirationDate(QDateTime::currentDateTime().addYears(10)); + cookies << cookie; + } } } - return cookies; -} -void Preferences::setHostNameCookies(const QString &host_name, const QList &cookies) -{ - QMap hosts_table = value("Rss/hosts_cookies").toMap(); - QByteArray raw_cookies = ""; - foreach (const QByteArray& cookie, cookies) - raw_cookies += cookie + ":"; - if (raw_cookies.endsWith(":")) - raw_cookies.chop(1); - hosts_table.insert(host_name, raw_cookies); - setValue("Rss/hosts_cookies", hosts_table); + setNetworkCookies(cookies); + + QWriteLocker locker(&lock); + dirty = true; + timer.start(); + m_data.remove("Rss/hosts_cookies"); } QList Preferences::getNetworkCookies() const diff --git a/src/base/preferences.h b/src/base/preferences.h index 96fe22fb7..23047ed4d 100644 --- a/src/base/preferences.h +++ b/src/base/preferences.h @@ -538,13 +538,12 @@ public: void setRssFeedsUrls(const QStringList &rssFeeds); QStringList getRssFeedsAliases() const; void setRssFeedsAliases(const QStringList &rssAliases); - QList getHostNameCookies(const QString &host_name) const; - 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); + // Temporary method for upgrade purposes + void moveRSSCookies(); // SpeedWidget int getSpeedWidgetPeriod() const; diff --git a/src/gui/rss/cookiesdlg.cpp b/src/gui/rss/cookiesdlg.cpp index e5662d2fc..ed4ce9c41 100644 --- a/src/gui/rss/cookiesdlg.cpp +++ b/src/gui/rss/cookiesdlg.cpp @@ -31,12 +31,14 @@ #include "cookiesdlg.h" #include "ui_cookiesdlg.h" #include "guiiconprovider.h" +#include "base/net/downloadmanager.h" #include +#include enum CookiesCols { COOKIE_KEY, COOKIE_VALUE}; -CookiesDlg::CookiesDlg(QWidget *parent, const QList &raw_cookies) : +CookiesDlg::CookiesDlg(const QUrl &url, QWidget *parent) : QDialog(parent), ui(new Ui::CookiesDlg) { @@ -46,13 +48,13 @@ CookiesDlg::CookiesDlg(QWidget *parent, const QList &raw_cookies) : ui->del_btn->setIcon(GuiIconProvider::instance()->getIcon("list-remove")); ui->infos_lbl->setText(tr("Common keys for cookies are: '%1', '%2'.\nYou should get this information from your Web browser preferences.").arg("uid").arg("pass")); - foreach (const QByteArray &raw_cookie, raw_cookies) { - QList cookie_parts = raw_cookie.split('='); - if (cookie_parts.size() != 2) continue; + + QList cookies = Net::DownloadManager::instance()->cookiesForUrl(url); + foreach (const QNetworkCookie &cookie, cookies) { const int i = ui->cookiesTable->rowCount(); ui->cookiesTable->setRowCount(i+1); - ui->cookiesTable->setItem(i, COOKIE_KEY, new QTableWidgetItem(cookie_parts.first().data())); - ui->cookiesTable->setItem(i, COOKIE_VALUE, new QTableWidgetItem(cookie_parts.last().data())); + ui->cookiesTable->setItem(i, COOKIE_KEY, new QTableWidgetItem(QString(cookie.name()))); + ui->cookiesTable->setItem(i, COOKIE_VALUE, new QTableWidgetItem(QString(cookie.value()))); } } @@ -75,8 +77,9 @@ void CookiesDlg::on_del_btn_clicked() { } } -QList CookiesDlg::getCookies() const { - QList ret; +QList CookiesDlg::getCookies() const { + QList ret; + auto now = QDateTime::currentDateTime(); for (int i=0; icookiesTable->rowCount(); ++i) { QString key; if (ui->cookiesTable->item(i, COOKIE_KEY)) @@ -85,20 +88,23 @@ QList CookiesDlg::getCookies() const { if (ui->cookiesTable->item(i, COOKIE_VALUE)) value = ui->cookiesTable->item(i, COOKIE_VALUE)->text().trimmed(); if (!key.isEmpty() && !value.isEmpty()) { - const QString raw_cookie = key+"="+value; - qDebug("Cookie: %s", qPrintable(raw_cookie)); - ret << raw_cookie.toLocal8Bit(); + QNetworkCookie cookie(key.toUtf8(), value.toUtf8()); + // TODO: Delete this hack when advanced Cookie dialog will be implemented. + cookie.setExpirationDate(now.addYears(10)); + qDebug("Cookie: %s", cookie.toRawForm().data()); + ret << cookie; } } return ret; } -QList CookiesDlg::askForCookies(QWidget *parent, const QList &raw_cookies, bool *ok) { - CookiesDlg dlg(parent, raw_cookies); +bool CookiesDlg::askForCookies(QWidget *parent, const QUrl &url, QList &out) +{ + CookiesDlg dlg(url, parent); if (dlg.exec()) { - *ok = true; - return dlg.getCookies(); + out = dlg.getCookies(); + return true; } - *ok = false; - return QList(); + + return false; } diff --git a/src/gui/rss/cookiesdlg.h b/src/gui/rss/cookiesdlg.h index 3e7469973..e9e6fc733 100644 --- a/src/gui/rss/cookiesdlg.h +++ b/src/gui/rss/cookiesdlg.h @@ -32,22 +32,24 @@ #define COOKIESDLG_H #include +#include + +class QNetworkCookie; +class QUrl; -QT_BEGIN_NAMESPACE namespace Ui { class CookiesDlg; } -QT_END_NAMESPACE class CookiesDlg : public QDialog { Q_OBJECT public: - explicit CookiesDlg(QWidget *parent = 0, const QList &raw_cookies = QList()); + explicit CookiesDlg(const QUrl &url, QWidget *parent = 0); ~CookiesDlg(); - QList getCookies() const; - static QList askForCookies(QWidget *parent, const QList &raw_cookies, bool *ok); + QList getCookies() const; + static bool askForCookies(QWidget *parent, const QUrl &url, QList &out); protected slots: void on_add_btn_clicked(); diff --git a/src/gui/rss/rss_imp.cpp b/src/gui/rss/rss_imp.cpp index 2cda0096c..106b7cb30 100644 --- a/src/gui/rss/rss_imp.cpp +++ b/src/gui/rss/rss_imp.cpp @@ -142,18 +142,19 @@ void RSSImp::displayItemsListMenu(const QPoint&) void RSSImp::on_actionManage_cookies_triggered() { Q_ASSERT(!m_feedList->selectedItems().empty()); - // Get feed hostname - QString feed_url = m_feedList->getItemID(m_feedList->selectedItems().first()); - QString feed_hostname = QUrl::fromEncoded(feed_url.toUtf8()).host(); - qDebug("RSS Feed hostname is: %s", qPrintable(feed_hostname)); - Q_ASSERT(!feed_hostname.isEmpty()); - bool ok = false; - Preferences* const pref = Preferences::instance(); - QList raw_cookies = CookiesDlg::askForCookies(this, pref->getHostNameCookies(feed_hostname), &ok); - if (ok) { - qDebug() << "Settings cookies for host name: " << feed_hostname; - pref->setHostNameCookies(feed_hostname, raw_cookies); - Net::DownloadManager::instance()->setCookiesFromUrl(pref->getHostNameQNetworkCookies(feed_hostname), feed_hostname); + + // TODO: Create advanced application wide Cookie dialog and use it everywhere. + QUrl feedUrl = QUrl::fromEncoded(m_feedList->getItemID(m_feedList->selectedItems().first()).toUtf8()); + QList cookies; + if (CookiesDlg::askForCookies(this, feedUrl, cookies)) { + auto downloadManager = Net::DownloadManager::instance(); + QList oldCookies = downloadManager->cookiesForUrl(feedUrl); + foreach (const QNetworkCookie &oldCookie, oldCookies) { + if (!cookies.contains(oldCookie)) + downloadManager->deleteCookie(oldCookie); + } + + downloadManager->setCookiesFromUrl(cookies, feedUrl); } }