Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions src/app/application.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@
#include "base/net/downloadmanager.h"
#include "base/net/geoipmanager.h"
#include "base/net/proxyconfigurationmanager.h"
#include "base/net/reverseresolution.h"
#include "base/net/smtp.h"
#include "base/preferences.h"
#include "base/profile.h"
Expand Down Expand Up @@ -911,6 +912,7 @@ int Application::exec()
m_addTorrentManager = new AddTorrentManagerImpl(this, BitTorrent::Session::instance(), this);

Net::GeoIPManager::initInstance();
Net::ReverseResolution::initInstance();
TorrentFilesWatcher::initInstance();

new RSS::Session; // create RSS::Session singleton
Expand Down Expand Up @@ -1405,6 +1407,7 @@ void Application::cleanup()
TorrentFilesWatcher::freeInstance();
delete m_addTorrentManager;
BitTorrent::Session::freeInstance();
Net::ReverseResolution::freeInstance();
Net::GeoIPManager::freeInstance();
Net::DownloadManager::freeInstance();
Net::ProxyConfigurationManager::freeInstance();
Expand Down
7 changes: 7 additions & 0 deletions src/base/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -247,6 +247,13 @@ if (CMAKE_SYSTEM_NAME STREQUAL "Darwin")
${Carbon_LIBRARY}
${IOKit_LIBRARY}
)
elseif (CMAKE_SYSTEM_NAME STREQUAL "Linux")
include(CheckSymbolExists)
check_symbol_exists(getrandom "sys/random.h" HAVE_GETRANDOM)

if (HAVE_GETRANDOM)
target_compile_definitions(qbt_base PUBLIC QBT_USES_GETRANDOM)
endif()
elseif (CMAKE_SYSTEM_NAME STREQUAL "Windows")
target_link_libraries(qbt_base PRIVATE iphlpapi powrprof)
endif()
Expand Down
2 changes: 0 additions & 2 deletions src/base/bittorrent/sessionimpl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5732,8 +5732,6 @@ void SessionImpl::fetchPendingAlerts(const lt::time_duration time)

void SessionImpl::endAlertSequence(const int alertType, const qsizetype alertCount)
{
qDebug() << "End alert sequence. Alert:" << lt::alert_name(alertType) << "Count:" << alertCount;

if (alertType == lt::add_torrent_alert::alert_type)
{
emit addTorrentAlertsReceived(alertCount);
Expand Down
30 changes: 23 additions & 7 deletions src/base/net/reverseresolution.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,26 @@ namespace
}
}

ReverseResolution::ReverseResolution(QObject *parent)
: QObject(parent)
ReverseResolution *ReverseResolution::m_instance = nullptr;

void ReverseResolution::initInstance()
{
if (!m_instance)
m_instance = new ReverseResolution;
}

void ReverseResolution::freeInstance()
{
delete m_instance;
m_instance = nullptr;
}

ReverseResolution *ReverseResolution::instance()
{
return m_instance;
}

ReverseResolution::ReverseResolution()
{
m_cache.setMaxCost(CACHE_SIZE);
}
Expand All @@ -56,18 +74,16 @@ ReverseResolution::~ReverseResolution()
QHostInfo::abortHostLookup(iter.key());
}

void ReverseResolution::resolve(const QHostAddress &ip)
QString ReverseResolution::resolve(const QHostAddress &ip)
{
const QString *hostname = m_cache.object(ip);
if (hostname)
{
emit ipResolved(ip, *hostname);
return;
}
return *hostname;

// do reverse lookup: IP -> hostname
const int lookupId = QHostInfo::lookupHost(ip.toString(), this, &ReverseResolution::hostResolved);
m_lookups.insert(lookupId, ip);
return {};
}

void ReverseResolution::hostResolved(const QHostInfo &host)
Expand Down
14 changes: 10 additions & 4 deletions src/base/net/reverseresolution.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,16 +37,17 @@ class QString;

namespace Net
{
class ReverseResolution : public QObject
class ReverseResolution final : public QObject
{
Q_OBJECT
Q_DISABLE_COPY_MOVE(ReverseResolution)

public:
explicit ReverseResolution(QObject *parent = nullptr);
~ReverseResolution();
static void initInstance();
static void freeInstance();
static ReverseResolution *instance();

void resolve(const QHostAddress &ip);
QString resolve(const QHostAddress &ip);

signals:
void ipResolved(const QHostAddress &ip, const QString &hostname);
Expand All @@ -55,6 +56,11 @@ namespace Net
void hostResolved(const QHostInfo &host);

private:
ReverseResolution();
~ReverseResolution() override;

static ReverseResolution *m_instance;

QHash<int, QHostAddress> m_lookups; // <LookupID, IP>
QCache<QHostAddress, QString> m_cache; // <IP, HostName>
};
Expand Down
2 changes: 1 addition & 1 deletion src/base/utils/random.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@

#include <QtSystemDetection>

#if defined(Q_OS_LINUX)
#if defined(Q_OS_LINUX) && defined(QBT_USES_GETRANDOM)
#include "randomlayer_linux.cpp"
#elif defined(Q_OS_WIN)
#include "randomlayer_win.cpp"
Expand Down
28 changes: 17 additions & 11 deletions src/gui/properties/peerlistwidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -244,19 +244,21 @@ void PeerListWidget::displayColumnHeaderMenu()

void PeerListWidget::updatePeerHostNameResolutionState()
{
if (Preferences::instance()->resolvePeerHostNames())
const bool resolveHostNames = Preferences::instance()->resolvePeerHostNames();
if (resolveHostNames == m_resolveHostNames)
return;

m_resolveHostNames = resolveHostNames;
if (m_resolveHostNames)
{
if (!m_resolver)
{
m_resolver = new Net::ReverseResolution(this);
connect(m_resolver, &Net::ReverseResolution::ipResolved, this, &PeerListWidget::handleResolved);
loadPeers(m_properties->getCurrentTorrent());
}
connect(Net::ReverseResolution::instance(), &Net::ReverseResolution::ipResolved
, this, &PeerListWidget::handleResolved);
loadPeers(m_properties->getCurrentTorrent());
}
else
{
delete m_resolver;
m_resolver = nullptr;
disconnect(Net::ReverseResolution::instance(), &Net::ReverseResolution::ipResolved
, this, &PeerListWidget::handleResolved);
}
}

Expand Down Expand Up @@ -529,8 +531,12 @@ void PeerListWidget::updatePeer(const int row, const BitTorrent::Torrent *torren
setModelData(m_listModel, row, PeerListColumns::DOWNLOADING_PIECE, downloadingFilesDisplayValue
, downloadingFilesDisplayValue, {}, downloadingFiles.join(u'\n'));

if (!peer.useI2PSocket() && m_resolver)
m_resolver->resolve(peer.address().ip);
if (!peer.useI2PSocket() && m_resolveHostNames)
{
const QString hostName = Net::ReverseResolution::instance()->resolve(peer.address().ip);
if (!hostName.isEmpty())
setModelData(m_listModel, row, PeerListColumns::IP, hostName, hostName);
}

if (m_resolveCountries)
{
Expand Down
8 changes: 2 additions & 6 deletions src/gui/properties/peerlistwidget.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,10 +47,6 @@ namespace BitTorrent
class PeerInfo;
}

namespace Net
{
class ReverseResolution;
}

class PeerListWidget final : public QTreeView
{
Expand Down Expand Up @@ -106,9 +102,9 @@ private slots:
QStandardItemModel *m_listModel = nullptr;
PeerListSortModel *m_proxyModel = nullptr;
PropertiesWidget *m_properties = nullptr;
Net::ReverseResolution *m_resolver = nullptr;
QHash<PeerEndpoint, QStandardItem *> m_peerItems;
QList<QStandardItem *> m_I2PPeerItems;
QHash<QHostAddress, QSet<QStandardItem *>> m_itemsByIP; // must be kept in sync with `m_peerItems`
bool m_resolveCountries;
bool m_resolveCountries = false;
bool m_resolveHostNames = false;
};
2 changes: 0 additions & 2 deletions src/webui/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ add_library(qbt_webui STATIC
api/transfercontroller.h
api/serialize/serialize_torrent.h
clientdatastorage.h
peerhostnameresolver.h
webapplication.h
webui.h

Expand All @@ -35,7 +34,6 @@ add_library(qbt_webui STATIC
api/transfercontroller.cpp
api/serialize/serialize_torrent.cpp
clientdatastorage.cpp
peerhostnameresolver.cpp
webapplication.cpp
webui.cpp
)
Expand Down
38 changes: 17 additions & 21 deletions src/webui/api/synccontroller.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,11 +45,11 @@
#include "base/bittorrent/trackerentrystatus.h"
#include "base/global.h"
#include "base/net/geoipmanager.h"
#include "base/net/reverseresolution.h"
#include "base/preferences.h"
#include "base/utils/string.h"
#include "apierror.h"
#include "serialize/serialize_torrent.h"
#include "webui/peerhostnameresolver.h"

namespace
{
Expand Down Expand Up @@ -443,12 +443,6 @@ namespace
}
}

SyncController::SyncController(PeerHostNameResolver *peerHostNameResolver, IApplication *app, QObject *parent)
: APIController(app, parent)
, m_peerHostNameResolver {peerHostNameResolver}
{
}

void SyncController::updateFreeDiskSpace(const qint64 freeDiskSpace)
{
m_freeDiskSpace = freeDiskSpace;
Expand Down Expand Up @@ -878,20 +872,6 @@ void SyncController::torrentPeersAction()
peer.insert(KEY_PEER_FILES, filesForPiece.join(u'\n'));
}

if (!useI2PSocket)
{
if (resolvePeerHostNames)
peer[KEY_PEER_HOST_NAME] = m_peerHostNameResolver->lookupHostName(pi.address().ip);
else
peer[KEY_PEER_HOST_NAME] = {};
}

if (resolvePeerCountries && !useI2PSocket)
{
peer[KEY_PEER_COUNTRY_CODE] = pi.country().toLower();
peer[KEY_PEER_COUNTRY] = Net::GeoIPManager::CountryName(pi.country());
}

if (useI2PSocket)
{
peer[KEY_PEER_I2P_DEST] = pi.I2PAddress();
Expand All @@ -901,6 +881,22 @@ void SyncController::torrentPeersAction()
{
peer[KEY_PEER_IP] = pi.address().ip.toString();
peer[KEY_PEER_PORT] = pi.address().port;

peer[KEY_PEER_HOST_NAME] = resolvePeerHostNames
? Net::ReverseResolution::instance()->resolve(pi.address().ip)
: QString();

if (resolvePeerCountries)
{
peer[KEY_PEER_COUNTRY_CODE] = pi.country().toLower();
peer[KEY_PEER_COUNTRY] = Net::GeoIPManager::CountryName(pi.country());
}
else
{
peer[KEY_PEER_COUNTRY_CODE] = {};
peer[KEY_PEER_COUNTRY] = {};
}

peers[pi.address().toString()] = peer;
}
}
Expand Down
6 changes: 1 addition & 5 deletions src/webui/api/synccontroller.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,6 @@
#include "base/tag.h"
#include "apicontroller.h"

class PeerHostNameResolver;

namespace BitTorrent
{
class Torrent;
Expand All @@ -48,8 +46,7 @@ class SyncController : public APIController
Q_OBJECT
Q_DISABLE_COPY_MOVE(SyncController)

public:
explicit SyncController(PeerHostNameResolver *peerHostNameResolver, IApplication *app, QObject *parent = nullptr);
using APIController::APIController;

public slots:
void updateFreeDiskSpace(qint64 freeDiskSpace);
Expand Down Expand Up @@ -83,7 +80,6 @@ private slots:
void onTorrentTrackerEntryStatusesUpdated(const BitTorrent::Torrent *torrent
, const QHash<QString, BitTorrent::TrackerEntryStatus> &updatedTrackers);

PeerHostNameResolver *m_peerHostNameResolver = nullptr;
qint64 m_freeDiskSpace = 0;

QVariantMap m_lastPeersResponse;
Expand Down
71 changes: 0 additions & 71 deletions src/webui/peerhostnameresolver.cpp

This file was deleted.

Loading
Loading