mirror of
https://github.com/qbittorrent/qBittorrent.git
synced 2025-01-12 18:24:58 +08:00
Added cookie support for RSS feeds (Needs testing)
This commit is contained in:
parent
119bda1595
commit
994c798264
95
src/cookiesdlg.cpp
Normal file
95
src/cookiesdlg.cpp
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
/*
|
||||||
|
* Bittorrent Client using Qt4 and libtorrent.
|
||||||
|
* Copyright (C) 2010 Christophe Dumez
|
||||||
|
*
|
||||||
|
* This program 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 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program 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 this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*
|
||||||
|
* In addition, as a special exception, the copyright holders give permission to
|
||||||
|
* link this program with the OpenSSL project's "OpenSSL" library (or with
|
||||||
|
* modified versions of it that use the same license as the "OpenSSL" library),
|
||||||
|
* and distribute the linked executables. You must obey the GNU General Public
|
||||||
|
* License in all respects for all of the code used other than "OpenSSL". If you
|
||||||
|
* modify file(s), you may extend this exception to your version of the file(s),
|
||||||
|
* but you are not obligated to do so. If you do not wish to do so, delete this
|
||||||
|
* exception statement from your version.
|
||||||
|
*
|
||||||
|
* Contact : chris@qbittorrent.org arnaud@qbittorrent.org
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "cookiesdlg.h"
|
||||||
|
#include "ui_cookiesdlg.h"
|
||||||
|
|
||||||
|
#include <QNetworkCookie>
|
||||||
|
|
||||||
|
enum CookiesCols { COOKIE_KEY, COOKIE_VALUE};
|
||||||
|
|
||||||
|
CookiesDlg::CookiesDlg(QWidget *parent, const QList<QByteArray> &raw_cookies) :
|
||||||
|
QDialog(parent),
|
||||||
|
ui(new Ui::CookiesDlg)
|
||||||
|
{
|
||||||
|
ui->setupUi(this);
|
||||||
|
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<QByteArray> cookie_parts = raw_cookie.split('=');
|
||||||
|
if(cookie_parts.size() != 2) continue;
|
||||||
|
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()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CookiesDlg::~CookiesDlg()
|
||||||
|
{
|
||||||
|
delete ui;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CookiesDlg::on_add_btn_clicked() {
|
||||||
|
ui->cookiesTable->setRowCount(ui->cookiesTable->rowCount()+1);
|
||||||
|
// Edit first column
|
||||||
|
ui->cookiesTable->editItem(ui->cookiesTable->item(ui->cookiesTable->rowCount()-1, COOKIE_KEY));
|
||||||
|
}
|
||||||
|
|
||||||
|
void CookiesDlg::on_del_btn_clicked() {
|
||||||
|
// Get selected cookie
|
||||||
|
QList<QTableWidgetItem*> selection = ui->cookiesTable->selectedItems();
|
||||||
|
if(!selection.isEmpty()) {
|
||||||
|
ui->cookiesTable->removeRow(selection.first()->row());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QList<QByteArray> CookiesDlg::getCookies() const {
|
||||||
|
QList<QByteArray> ret;
|
||||||
|
for(int i=0; i<ui->cookiesTable->rowCount(); ++i) {
|
||||||
|
QString key = ui->cookiesTable->item(i, COOKIE_KEY)->text().trimmed();
|
||||||
|
QString 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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
QList<QByteArray> CookiesDlg::askForCookies(QWidget *parent, const QList<QByteArray> &raw_cookies, bool *ok) {
|
||||||
|
CookiesDlg dlg(parent, raw_cookies);
|
||||||
|
if(dlg.exec()) {
|
||||||
|
*ok = true;
|
||||||
|
return dlg.getCookies();
|
||||||
|
}
|
||||||
|
*ok = false;
|
||||||
|
return QList<QByteArray>();
|
||||||
|
}
|
58
src/cookiesdlg.h
Normal file
58
src/cookiesdlg.h
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
/*
|
||||||
|
* Bittorrent Client using Qt4 and libtorrent.
|
||||||
|
* Copyright (C) 2010 Christophe Dumez
|
||||||
|
*
|
||||||
|
* This program 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 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program 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 this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*
|
||||||
|
* In addition, as a special exception, the copyright holders give permission to
|
||||||
|
* link this program with the OpenSSL project's "OpenSSL" library (or with
|
||||||
|
* modified versions of it that use the same license as the "OpenSSL" library),
|
||||||
|
* and distribute the linked executables. You must obey the GNU General Public
|
||||||
|
* License in all respects for all of the code used other than "OpenSSL". If you
|
||||||
|
* modify file(s), you may extend this exception to your version of the file(s),
|
||||||
|
* but you are not obligated to do so. If you do not wish to do so, delete this
|
||||||
|
* exception statement from your version.
|
||||||
|
*
|
||||||
|
* Contact : chris@qbittorrent.org arnaud@qbittorrent.org
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef COOKIESDLG_H
|
||||||
|
#define COOKIESDLG_H
|
||||||
|
|
||||||
|
#include <QDialog>
|
||||||
|
|
||||||
|
namespace Ui {
|
||||||
|
class CookiesDlg;
|
||||||
|
}
|
||||||
|
|
||||||
|
class CookiesDlg : public QDialog
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit CookiesDlg(QWidget *parent = 0, const QList<QByteArray> &raw_cookies = QList<QByteArray>());
|
||||||
|
~CookiesDlg();
|
||||||
|
QList<QByteArray> getCookies() const;
|
||||||
|
static QList<QByteArray> askForCookies(QWidget *parent, const QList<QByteArray> &raw_cookies, bool *ok);
|
||||||
|
|
||||||
|
protected slots:
|
||||||
|
void on_add_btn_clicked();
|
||||||
|
void on_del_btn_clicked();
|
||||||
|
|
||||||
|
private:
|
||||||
|
Ui::CookiesDlg *ui;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // COOKIESDLG_H
|
@ -28,12 +28,16 @@
|
|||||||
* Contact : chris@qbittorrent.org
|
* Contact : chris@qbittorrent.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "downloadthread.h"
|
|
||||||
#include <QTemporaryFile>
|
#include <QTemporaryFile>
|
||||||
#include <QSettings>
|
#include <QSettings>
|
||||||
#include <QNetworkAccessManager>
|
#include <QNetworkAccessManager>
|
||||||
#include <QNetworkRequest>
|
#include <QNetworkRequest>
|
||||||
#include <QNetworkProxy>
|
#include <QNetworkProxy>
|
||||||
|
#include <QNetworkCookie>
|
||||||
|
#include <QNetworkCookieJar>
|
||||||
|
|
||||||
|
#include "downloadthread.h"
|
||||||
|
#include "preferences.h"
|
||||||
|
|
||||||
enum ProxyType {HTTP=1, SOCKS5=2, HTTP_PW=3, SOCKS5_PW=4, SOCKS4=5};
|
enum ProxyType {HTTP=1, SOCKS5=2, HTTP_PW=3, SOCKS5_PW=4, SOCKS4=5};
|
||||||
|
|
||||||
@ -95,7 +99,27 @@ void downloadThread::processDlFinished(QNetworkReply* reply) {
|
|||||||
reply->deleteLater();
|
reply->deleteLater();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void downloadThread::loadCookies(QString host_name, QString url) {
|
||||||
|
const QList<QByteArray> &raw_cookies = Preferences::getHostNameCookies(host_name);
|
||||||
|
QNetworkCookieJar *cookie_jar = networkManager.cookieJar();
|
||||||
|
QList<QNetworkCookie> cookies;
|
||||||
|
foreach(const QByteArray& raw_cookie, raw_cookies) {
|
||||||
|
QList<QByteArray> cookie_parts = raw_cookie.split('=');
|
||||||
|
if(cookie_parts.size() == 2) {
|
||||||
|
qDebug("Loading cookie: %s", raw_cookie.constData());
|
||||||
|
cookies << QNetworkCookie(cookie_parts.first(), cookie_parts.last());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cookie_jar->setCookiesFromUrl(cookies, url);
|
||||||
|
networkManager.setCookieJar(cookie_jar);
|
||||||
|
}
|
||||||
|
|
||||||
void downloadThread::downloadTorrentUrl(QString url){
|
void downloadThread::downloadTorrentUrl(QString url){
|
||||||
|
// Load cookies
|
||||||
|
QString host_name = QUrl::fromEncoded(url.toLocal8Bit()).host();
|
||||||
|
if(!host_name.isEmpty())
|
||||||
|
loadCookies(host_name, url);
|
||||||
|
// Process request
|
||||||
QNetworkReply *reply = downloadUrl(url);
|
QNetworkReply *reply = downloadUrl(url);
|
||||||
connect(reply, SIGNAL(downloadProgress(qint64,qint64)), this, SLOT(checkDownloadSize(qint64,qint64)));
|
connect(reply, SIGNAL(downloadProgress(qint64,qint64)), this, SLOT(checkDownloadSize(qint64,qint64)));
|
||||||
}
|
}
|
||||||
@ -103,6 +127,10 @@ void downloadThread::downloadTorrentUrl(QString url){
|
|||||||
QNetworkReply* downloadThread::downloadUrl(QString url){
|
QNetworkReply* downloadThread::downloadUrl(QString url){
|
||||||
// Update proxy settings
|
// Update proxy settings
|
||||||
applyProxySettings();
|
applyProxySettings();
|
||||||
|
// Load cookies
|
||||||
|
QString host_name = QUrl::fromEncoded(url.toLocal8Bit()).host();
|
||||||
|
if(!host_name.isEmpty())
|
||||||
|
loadCookies(host_name, url);
|
||||||
// Process download request
|
// Process download request
|
||||||
qDebug("url is %s", qPrintable(url));
|
qDebug("url is %s", qPrintable(url));
|
||||||
const QUrl &qurl = QUrl::fromEncoded(url.toLocal8Bit());
|
const QUrl &qurl = QUrl::fromEncoded(url.toLocal8Bit());
|
||||||
|
@ -58,6 +58,7 @@ public:
|
|||||||
protected:
|
protected:
|
||||||
QString errorCodeToString(QNetworkReply::NetworkError status);
|
QString errorCodeToString(QNetworkReply::NetworkError status);
|
||||||
void applyProxySettings();
|
void applyProxySettings();
|
||||||
|
void loadCookies(QString host_name, QString url);
|
||||||
|
|
||||||
protected slots:
|
protected slots:
|
||||||
void processDlFinished(QNetworkReply* reply);
|
void processDlFinished(QNetworkReply* reply);
|
||||||
|
@ -149,6 +149,7 @@
|
|||||||
<file>Icons/oxygen/encrypted.png</file>
|
<file>Icons/oxygen/encrypted.png</file>
|
||||||
<file>Icons/oxygen/edit_clear.png</file>
|
<file>Icons/oxygen/edit_clear.png</file>
|
||||||
<file>Icons/oxygen/download.png</file>
|
<file>Icons/oxygen/download.png</file>
|
||||||
|
<file>Icons/oxygen/cookies.png</file>
|
||||||
<file>Icons/oxygen/gear32.png</file>
|
<file>Icons/oxygen/gear32.png</file>
|
||||||
<file>Icons/oxygen/gear.png</file>
|
<file>Icons/oxygen/gear.png</file>
|
||||||
<file>Icons/oxygen/remove.png</file>
|
<file>Icons/oxygen/remove.png</file>
|
||||||
|
@ -951,6 +951,28 @@ public:
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static QList<QByteArray> getHostNameCookies(QString host_name) {
|
||||||
|
QSettings qBTRSS("qBittorrent", "qBittorrent-rss");
|
||||||
|
QList<QByteArray> ret;
|
||||||
|
QMap<QString, QVariant> hosts_table = qBTRSS.value("hosts_cookies", QMap<QString, QVariant>()).toMap();
|
||||||
|
if(!hosts_table.contains(host_name)) return ret;
|
||||||
|
QByteArray raw_cookies = hosts_table.value(host_name).toByteArray();
|
||||||
|
return raw_cookies.split(':');
|
||||||
|
}
|
||||||
|
|
||||||
|
static void setHostNameCookies(QString host_name, const QList<QByteArray> &cookies) {
|
||||||
|
QSettings qBTRSS("qBittorrent", "qBittorrent-rss");
|
||||||
|
QMap<QString, QVariant> hosts_table = qBTRSS.value("hosts_cookies", QMap<QString, QVariant>()).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);
|
||||||
|
qBTRSS.setValue("hosts_cookies", hosts_table);
|
||||||
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // PREFERENCES_H
|
#endif // PREFERENCES_H
|
||||||
|
@ -41,6 +41,8 @@
|
|||||||
#include "feeddownloader.h"
|
#include "feeddownloader.h"
|
||||||
#include "feedList.h"
|
#include "feedList.h"
|
||||||
#include "bittorrent.h"
|
#include "bittorrent.h"
|
||||||
|
#include "cookiesdlg.h"
|
||||||
|
#include "preferences.h"
|
||||||
|
|
||||||
enum NewsCols { NEWS_ICON, NEWS_TITLE_COL, NEWS_URL_COL, NEWS_ID };
|
enum NewsCols { NEWS_ICON, NEWS_TITLE_COL, NEWS_URL_COL, NEWS_ID };
|
||||||
|
|
||||||
@ -61,8 +63,11 @@ void RSSImp::displayRSSListMenu(const QPoint& pos){
|
|||||||
myRSSListMenu.addAction(actionRename);
|
myRSSListMenu.addAction(actionRename);
|
||||||
myRSSListMenu.addAction(actionDelete);
|
myRSSListMenu.addAction(actionDelete);
|
||||||
myRSSListMenu.addSeparator();
|
myRSSListMenu.addSeparator();
|
||||||
if(listStreams->getItemType(selectedItems.first()) == RssFile::FOLDER)
|
if(listStreams->getItemType(selectedItems.first()) == RssFile::FOLDER) {
|
||||||
myRSSListMenu.addAction(actionNew_folder);
|
myRSSListMenu.addAction(actionNew_folder);
|
||||||
|
} else {
|
||||||
|
myRSSListMenu.addAction(actionManage_cookies);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
myRSSListMenu.addAction(actionNew_subscription);
|
myRSSListMenu.addAction(actionNew_subscription);
|
||||||
@ -103,6 +108,20 @@ void RSSImp::displayItemsListMenu(const QPoint&){
|
|||||||
myItemListMenu.exec(QCursor::pos());
|
myItemListMenu.exec(QCursor::pos());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RSSImp::on_actionManage_cookies_triggered() {
|
||||||
|
Q_ASSERT(!listStreams->selectedItems().empty());
|
||||||
|
// Get feed hostname
|
||||||
|
QString feed_url = listStreams->getItemID(listStreams->selectedItems().first());
|
||||||
|
QString feed_hostname = QUrl::fromEncoded(feed_url.toLocal8Bit()).host();
|
||||||
|
qDebug("RSS Feed hostname is: %s", qPrintable(feed_hostname));
|
||||||
|
Q_ASSERT(!feed_hostname.isEmpty());
|
||||||
|
bool ok = false;
|
||||||
|
QList<QByteArray> raw_cookies = CookiesDlg::askForCookies(this, Preferences::getHostNameCookies(feed_hostname), &ok);
|
||||||
|
if(ok) {
|
||||||
|
Preferences::setHostNameCookies(feed_hostname, raw_cookies);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void RSSImp::askNewFolder() {
|
void RSSImp::askNewFolder() {
|
||||||
QTreeWidgetItem *parent_item = 0;
|
QTreeWidgetItem *parent_item = 0;
|
||||||
RssFolder *rss_parent;
|
RssFolder *rss_parent;
|
||||||
|
@ -79,6 +79,7 @@ protected slots:
|
|||||||
void saveFoldersOpenState();
|
void saveFoldersOpenState();
|
||||||
void loadFoldersOpenState();
|
void loadFoldersOpenState();
|
||||||
void displayOverwriteError(QString filename);
|
void displayOverwriteError(QString filename);
|
||||||
|
void on_actionManage_cookies_triggered();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
RSSImp(Bittorrent *BTSession);
|
RSSImp(Bittorrent *BTSession);
|
||||||
|
10
src/src.pro
10
src/src.pro
@ -247,7 +247,8 @@ HEADERS += misc.h \
|
|||||||
filesystemwatcher.h \
|
filesystemwatcher.h \
|
||||||
preferences.h \
|
preferences.h \
|
||||||
bandwidthscheduler.h \
|
bandwidthscheduler.h \
|
||||||
scannedfoldersmodel.h
|
scannedfoldersmodel.h \
|
||||||
|
cookiesdlg.h
|
||||||
|
|
||||||
contains(DEFINES, DISABLE_GUI):HEADERS += headlessloader.h
|
contains(DEFINES, DISABLE_GUI):HEADERS += headlessloader.h
|
||||||
else:HEADERS += GUI.h \
|
else:HEADERS += GUI.h \
|
||||||
@ -309,7 +310,8 @@ else:HEADERS += GUI.h \
|
|||||||
ui/feeddownloader.ui \
|
ui/feeddownloader.ui \
|
||||||
ui/propertieswidget.ui \
|
ui/propertieswidget.ui \
|
||||||
ui/peer.ui \
|
ui/peer.ui \
|
||||||
ui/confirmdeletiondlg.ui
|
ui/confirmdeletiondlg.ui \
|
||||||
|
ui/cookiesdlg.ui
|
||||||
|
|
||||||
SOURCES += main.cpp \
|
SOURCES += main.cpp \
|
||||||
bittorrent.cpp \
|
bittorrent.cpp \
|
||||||
@ -321,7 +323,8 @@ SOURCES += main.cpp \
|
|||||||
httpresponsegenerator.cpp \
|
httpresponsegenerator.cpp \
|
||||||
eventmanager.cpp \
|
eventmanager.cpp \
|
||||||
scannedfoldersmodel.cpp \
|
scannedfoldersmodel.cpp \
|
||||||
misc.cpp
|
misc.cpp \
|
||||||
|
cookiesdlg.cpp
|
||||||
|
|
||||||
!contains(DEFINES, DISABLE_GUI):SOURCES += GUI.cpp \
|
!contains(DEFINES, DISABLE_GUI):SOURCES += GUI.cpp \
|
||||||
options_imp.cpp \
|
options_imp.cpp \
|
||||||
@ -337,3 +340,4 @@ SOURCES += main.cpp \
|
|||||||
peerlistwidget.cpp
|
peerlistwidget.cpp
|
||||||
|
|
||||||
DESTDIR = .
|
DESTDIR = .
|
||||||
|
|
||||||
|
@ -148,12 +148,6 @@ p, li { white-space: pre-wrap; }
|
|||||||
<attribute name="headerStretchLastSection">
|
<attribute name="headerStretchLastSection">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</attribute>
|
</attribute>
|
||||||
<attribute name="headerVisible">
|
|
||||||
<bool>false</bool>
|
|
||||||
</attribute>
|
|
||||||
<attribute name="headerStretchLastSection">
|
|
||||||
<bool>true</bool>
|
|
||||||
</attribute>
|
|
||||||
<column>
|
<column>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string notr="true">Bullet</string>
|
<string notr="true">Bullet</string>
|
||||||
@ -292,6 +286,15 @@ p, li { white-space: pre-wrap; }
|
|||||||
<string>New folder</string>
|
<string>New folder</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
|
<action name="actionManage_cookies">
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="../icons.qrc">
|
||||||
|
<normaloff>:/Icons/oxygen/cookies.png</normaloff>:/Icons/oxygen/cookies.png</iconset>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Manage cookies</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
</widget>
|
</widget>
|
||||||
<resources>
|
<resources>
|
||||||
<include location="../icons.qrc"/>
|
<include location="../icons.qrc"/>
|
||||||
|
Loading…
Reference in New Issue
Block a user