Browse Source

- Support peer manual ban (from peer list)

adaptive-webui-19844
Christophe Dumez 15 years ago
parent
commit
7c84551150
  1. 1
      Changelog
  2. BIN
      src/Icons/oxygen/add_peer.png
  3. BIN
      src/Icons/oxygen/user-group-delete.png
  4. BIN
      src/Icons/oxygen/user-group-new.png
  5. 6
      src/bittorrent.cpp
  6. 1
      src/bittorrent.h
  7. 13
      src/filterParserThread.h
  8. 3
      src/icons.qrc
  9. 2
      src/peerlistdelegate.h
  10. 35
      src/peerlistwidget.cpp
  11. 1
      src/peerlistwidget.h
  12. 15
      src/preferences.h
  13. 4
      src/propertieswidget.cpp
  14. 1
      src/propertieswidget.h

1
Changelog

@ -24,6 +24,7 @@
- FEATURE: Torrents can be rechecked from Web UI (Stephanos Antaris) - FEATURE: Torrents can be rechecked from Web UI (Stephanos Antaris)
- FEATURE: New peers can manually be added to the torrents - FEATURE: New peers can manually be added to the torrents
- FEATURE: Support per-peer rate limiting - FEATURE: Support per-peer rate limiting
- FEATURE: Support peer manual ban
- COSMETIC: Merged download / upload lists - COSMETIC: Merged download / upload lists
- COSMETIC: Torrents can be filtered based on their status - COSMETIC: Torrents can be filtered based on their status
- COSMETIC: Torrent properties are now displayed in main window - COSMETIC: Torrent properties are now displayed in main window

BIN
src/Icons/oxygen/add_peer.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 644 B

BIN
src/Icons/oxygen/user-group-delete.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
src/Icons/oxygen/user-group-new.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

6
src/bittorrent.cpp

@ -363,6 +363,7 @@ void bittorrent::configureSession() {
// * Maximum ratio // * Maximum ratio
setDeleteRatio(Preferences::getDeleteRatio()); setDeleteRatio(Preferences::getDeleteRatio());
// Ip Filter // Ip Filter
FilterParserThread::processFilterList(s, Preferences::bannedIPs());
if(Preferences::isFilteringEnabled()) { if(Preferences::isFilteringEnabled()) {
enableIPFilter(Preferences::getFilter()); enableIPFilter(Preferences::getFilter());
}else{ }else{
@ -516,6 +517,11 @@ bool bittorrent::hasActiveTorrents() const {
return false; return false;
} }
void bittorrent::banIP(QString ip) {
FilterParserThread::processFilterList(s, QStringList(ip));
Preferences::banIP(ip);
}
// Delete a torrent from the session, given its hash // Delete a torrent from the session, given its hash
// permanent = true means that the torrent will be removed from the hard-drive too // permanent = true means that the torrent will be removed from the hard-drive too
void bittorrent::deleteTorrent(QString hash, bool permanent) { void bittorrent::deleteTorrent(QString hash, bool permanent) {

1
src/bittorrent.h

@ -169,6 +169,7 @@ class bittorrent : public QObject {
void addMagnetSkipAddDlg(QString uri); void addMagnetSkipAddDlg(QString uri);
void downloadFromURLList(const QStringList& urls); void downloadFromURLList(const QStringList& urls);
void configureSession(); void configureSession();
void banIP(QString ip);
protected slots: protected slots:
void addTorrentsFromScanFolder(QStringList&); void addTorrentsFromScanFolder(QStringList&);

13
src/filterParserThread.h

@ -389,6 +389,8 @@ class FilterParserThread : public QThread {
// * PeerGuardian Text (P2P): http://wiki.phoenixlabs.org/wiki/P2P_Format // * PeerGuardian Text (P2P): http://wiki.phoenixlabs.org/wiki/P2P_Format
// * PeerGuardian Binary (P2B): http://wiki.phoenixlabs.org/wiki/P2B_Format // * PeerGuardian Binary (P2B): http://wiki.phoenixlabs.org/wiki/P2B_Format
void processFilterFile(QString _filePath){ void processFilterFile(QString _filePath){
// First, import current filter
filter = s->get_ip_filter();
if(isRunning()) { if(isRunning()) {
// Already parsing a filter, abort first // Already parsing a filter, abort first
abort = true; abort = true;
@ -400,6 +402,17 @@ class FilterParserThread : public QThread {
start(); start();
} }
static void processFilterList(session *s, QStringList IPs) {
// First, import current filter
ip_filter filter = s->get_ip_filter();
foreach(const QString &ip, IPs) {
qDebug("Manual ban of peer %s", ip.toLocal8Bit().data());
address_v4 addr = address_v4::from_string(ip.toLocal8Bit().data());
filter.add_rule(addr, addr, ip_filter::blocked);
}
s->set_ip_filter(filter);
}
}; };
#endif #endif

3
src/icons.qrc

@ -105,6 +105,8 @@
<file>Icons/oxygen/edit-paste.png</file> <file>Icons/oxygen/edit-paste.png</file>
<file>Icons/oxygen/run-build.png</file> <file>Icons/oxygen/run-build.png</file>
<file>Icons/oxygen/proxy.png</file> <file>Icons/oxygen/proxy.png</file>
<file>Icons/oxygen/user-group-delete.png</file>
<file>Icons/oxygen/user-group-new.png</file>
<file>Icons/oxygen/log.png</file> <file>Icons/oxygen/log.png</file>
<file>Icons/oxygen/unavailable.png</file> <file>Icons/oxygen/unavailable.png</file>
<file>Icons/oxygen/button_ok.png</file> <file>Icons/oxygen/button_ok.png</file>
@ -142,6 +144,5 @@
<file>Icons/oxygen/unsubscribe.png</file> <file>Icons/oxygen/unsubscribe.png</file>
<file>Icons/oxygen/draw-rectangle.png</file> <file>Icons/oxygen/draw-rectangle.png</file>
<file>Icons/oxygen/subscribe16.png</file> <file>Icons/oxygen/subscribe16.png</file>
<file>Icons/oxygen/add_peer.png</file>
</qresource> </qresource>
</RCC> </RCC>

2
src/peerlistdelegate.h

@ -34,7 +34,7 @@
#include <QItemDelegate> #include <QItemDelegate>
#include "misc.h" #include "misc.h"
enum PeerListColumns {IP, CLIENT, PROGRESS, DOWN_SPEED, UP_SPEED, TOT_DOWN, TOT_UP}; enum PeerListColumns {IP, CLIENT, PROGRESS, DOWN_SPEED, UP_SPEED, TOT_DOWN, TOT_UP, IP_HIDDEN};
class PeerListDelegate: public QItemDelegate { class PeerListDelegate: public QItemDelegate {
Q_OBJECT Q_OBJECT

35
src/peerlistwidget.cpp

@ -48,8 +48,9 @@ PeerListWidget::PeerListWidget(PropertiesWidget *parent): properties(parent), di
setRootIsDecorated(false); setRootIsDecorated(false);
setItemsExpandable(false); setItemsExpandable(false);
setAllColumnsShowFocus(true); setAllColumnsShowFocus(true);
setSelectionMode(QAbstractItemView::ExtendedSelection);
// List Model // List Model
listModel = new QStandardItemModel(0, 7); listModel = new QStandardItemModel(0, 8);
listModel->setHeaderData(IP, Qt::Horizontal, tr("IP")); listModel->setHeaderData(IP, Qt::Horizontal, tr("IP"));
listModel->setHeaderData(CLIENT, Qt::Horizontal, tr("Client", "i.e.: Client application")); listModel->setHeaderData(CLIENT, Qt::Horizontal, tr("Client", "i.e.: Client application"));
listModel->setHeaderData(PROGRESS, Qt::Horizontal, tr("Progress", "i.e: % downloaded")); listModel->setHeaderData(PROGRESS, Qt::Horizontal, tr("Progress", "i.e: % downloaded"));
@ -62,6 +63,7 @@ PeerListWidget::PeerListWidget(PropertiesWidget *parent): properties(parent), di
proxyModel->setDynamicSortFilter(true); proxyModel->setDynamicSortFilter(true);
proxyModel->setSourceModel(listModel); proxyModel->setSourceModel(listModel);
setModel(proxyModel); setModel(proxyModel);
hideColumn(IP_HIDDEN);
// Context menu // Context menu
setContextMenuPolicy(Qt::CustomContextMenu); setContextMenuPolicy(Qt::CustomContextMenu);
connect(this, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(showPeerListMenu(QPoint))); connect(this, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(showPeerListMenu(QPoint)));
@ -112,26 +114,33 @@ void PeerListWidget::updatePeerCountryResolutionState() {
void PeerListWidget::showPeerListMenu(QPoint) { void PeerListWidget::showPeerListMenu(QPoint) {
QMenu menu; QMenu menu;
bool empty_menu = true;
QTorrentHandle h = properties->getCurrentTorrent(); QTorrentHandle h = properties->getCurrentTorrent();
if(!h.is_valid()) return; if(!h.is_valid()) return;
QModelIndexList selectedIndexes = selectionModel()->selectedRows(); QModelIndexList selectedIndexes = selectionModel()->selectedRows();
QStringList selectedPeerIPs; QStringList selectedPeerIPs;
foreach(const QModelIndex &index, selectedIndexes) { foreach(const QModelIndex &index, selectedIndexes) {
QString IP = proxyModel->data(index).toString(); int row = proxyModel->mapToSource(index).row();
QString IP = listModel->data(listModel->index(row, IP_HIDDEN)).toString();
selectedPeerIPs << IP; selectedPeerIPs << IP;
} }
// Add Peer Action // Add Peer Action
QAction *addPeerAct = 0; QAction *addPeerAct = 0;
if(!h.is_queued() && !h.is_checking()) { if(!h.is_queued() && !h.is_checking()) {
addPeerAct = menu.addAction(QIcon(":/Icons/oxygen/add_peer.png"), tr("Add a new peer")); addPeerAct = menu.addAction(QIcon(":/Icons/oxygen/user-group-new.png"), tr("Add a new peer"));
empty_menu = false;
} }
// Per Peer Speed limiting actions // Per Peer Speed limiting actions
QAction *upLimitAct = 0; QAction *upLimitAct = 0;
QAction *dlLimitAct = 0; QAction *dlLimitAct = 0;
QAction *banAct = 0;
if(!selectedPeerIPs.isEmpty()) { if(!selectedPeerIPs.isEmpty()) {
upLimitAct = menu.addAction(QIcon(":/Icons/skin/seeding.png"), tr("Limit upload rate")); upLimitAct = menu.addAction(QIcon(":/Icons/skin/seeding.png"), tr("Limit upload rate"));
dlLimitAct = menu.addAction(QIcon(":/Icons/skin/downloading.png"), tr("Limit download rate")); dlLimitAct = menu.addAction(QIcon(":/Icons/skin/downloading.png"), tr("Limit download rate"));
banAct = menu.addAction(QIcon(":/Icons/oxygen/user-group-delete.png"), tr("Ban peer permanently"));
empty_menu = false;
} }
if(empty_menu) return;
QAction *act = menu.exec(QCursor::pos()); QAction *act = menu.exec(QCursor::pos());
if(act == addPeerAct) { if(act == addPeerAct) {
boost::asio::ip::tcp::endpoint ep = PeerAdditionDlg::askForPeerEndpoint(); boost::asio::ip::tcp::endpoint ep = PeerAdditionDlg::askForPeerEndpoint();
@ -155,6 +164,25 @@ void PeerListWidget::showPeerListMenu(QPoint) {
limitDlRateSelectedPeers(selectedPeerIPs); limitDlRateSelectedPeers(selectedPeerIPs);
return; return;
} }
if(act == banAct) {
banSelectedPeers(selectedPeerIPs);
return;
}
}
void PeerListWidget::banSelectedPeers(QStringList peer_ips) {
// Confirm first
int ret = QMessageBox::question(this, tr("Are you sure? -- qBittorrent"), tr("Are you sure you want to ban permanently the selected peers?"),
tr("&Yes"), tr("&No"),
QString(), 0, 1);
if(ret) return;
foreach(const QString &ip, peer_ips) {
qDebug("Banning peer %s...", ip.toLocal8Bit().data());
properties->getBTSession()->addConsoleMessage(tr("Manually banning peer %1...").arg(ip));
properties->getBTSession()->banIP(ip);
}
// Refresh list
loadPeers(properties->getCurrentTorrent());
} }
void PeerListWidget::limitUpRateSelectedPeers(QStringList peer_ips) { void PeerListWidget::limitUpRateSelectedPeers(QStringList peer_ips) {
@ -270,6 +298,7 @@ QStandardItem* PeerListWidget::addPeer(QString ip, peer_info peer) {
// Adding Peer to peer list // Adding Peer to peer list
listModel->insertRow(row); listModel->insertRow(row);
listModel->setData(listModel->index(row, IP), ip); listModel->setData(listModel->index(row, IP), ip);
listModel->setData(listModel->index(row, IP_HIDDEN), ip);
// Resolve peer host name is asked // Resolve peer host name is asked
if(resolver) if(resolver)
resolver->resolve(peer.ip); resolver->resolve(peer.ip);

1
src/peerlistwidget.h

@ -78,6 +78,7 @@ protected slots:
void showPeerListMenu(QPoint); void showPeerListMenu(QPoint);
void limitUpRateSelectedPeers(QStringList peer_ips); void limitUpRateSelectedPeers(QStringList peer_ips);
void limitDlRateSelectedPeers(QStringList peer_ips); void limitDlRateSelectedPeers(QStringList peer_ips);
void banSelectedPeers(QStringList peer_ips);
}; };
#endif // PEERLISTWIDGET_H #endif // PEERLISTWIDGET_H

15
src/preferences.h

@ -367,6 +367,20 @@ public:
return settings.value(QString::fromUtf8("Preferences/IPFilter/File"), QString()).toString(); return settings.value(QString::fromUtf8("Preferences/IPFilter/File"), QString()).toString();
} }
static void banIP(QString ip) {
QSettings settings("qBittorrent", "qBittorrent");
QStringList banned_ips = settings.value(QString::fromUtf8("Preferences/IPFilter/BannedIPs"), QStringList()).toStringList();
if(!banned_ips.contains(ip)) {
banned_ips << ip;
settings.setValue("Preferences/IPFilter/BannedIPs", banned_ips);
}
}
static QStringList bannedIPs() {
QSettings settings("qBittorrent", "qBittorrent");
return settings.value(QString::fromUtf8("Preferences/IPFilter/BannedIPs"), QStringList()).toStringList();
}
// RSS // RSS
static bool isRSSEnabled() { static bool isRSSEnabled() {
QSettings settings("qBittorrent", "qBittorrent"); QSettings settings("qBittorrent", "qBittorrent");
@ -423,6 +437,7 @@ public:
QSettings settings("qBittorrent", "qBittorrent"); QSettings settings("qBittorrent", "qBittorrent");
return settings.value("Preferences/WebUI/Password", "").toString(); return settings.value("Preferences/WebUI/Password", "").toString();
} }
}; };
#endif // PREFERENCES_H #endif // PREFERENCES_H

4
src/propertieswidget.cpp

@ -186,6 +186,10 @@ const QTorrentHandle& PropertiesWidget::getCurrentTorrent() const {
return h; return h;
} }
bittorrent* PropertiesWidget::getBTSession() const {
return BTSession;
}
void PropertiesWidget::loadTorrentInfos(QTorrentHandle &_h) { void PropertiesWidget::loadTorrentInfos(QTorrentHandle &_h) {
h = _h; h = _h;
if(!h.is_valid()) { if(!h.is_valid()) {

1
src/propertieswidget.h

@ -113,6 +113,7 @@ public:
PropertiesWidget(QWidget *parent, TransferListWidget *transferList, bittorrent* BTSession); PropertiesWidget(QWidget *parent, TransferListWidget *transferList, bittorrent* BTSession);
~PropertiesWidget(); ~PropertiesWidget();
const QTorrentHandle& getCurrentTorrent() const; const QTorrentHandle& getCurrentTorrent() const;
bittorrent* getBTSession() const;
}; };
#endif // PROPERTIESWIDGET_H #endif // PROPERTIESWIDGET_H

Loading…
Cancel
Save