1
0
mirror of https://github.com/d47081/qBittorrent.git synced 2025-02-02 18:04:32 +00:00

Merge pull request #13337 from Chocobo1/libt2

Improve compatibility with libt 2.0
This commit is contained in:
Mike Tzou 2020-09-08 14:23:47 +08:00 committed by GitHub
commit 8954b21784
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 66 additions and 81 deletions

View File

@ -96,7 +96,7 @@ namespace
if (parser.tryParse(data)) if (parser.tryParse(data))
address = lt::address_v4(parser.parsed()); address = lt::address_v4(parser.parsed());
else else
address = lt::address_v6::from_string(data, ec); address = lt::make_address(data, ec);
return !ec; return !ec;
} }

View File

@ -200,6 +200,41 @@ namespace
return expanded; return expanded;
} }
QString toString(const lt::socket_type_t socketType)
{
#if (LIBTORRENT_VERSION_NUM >= 20000)
return QString::fromLatin1(lt::socket_type_name(socketType));
#else
switch (socketType)
{
case lt::socket_type_t::i2p:
return QLatin1String("I2P");
case lt::socket_type_t::socks5:
return QLatin1String("SOCKS5");
case lt::socket_type_t::tcp:
return QLatin1String("TCP");
case lt::socket_type_t::tcp_ssl:
return QLatin1String("TCP_SSL");
case lt::socket_type_t::udp:
return QLatin1String("UDP");
case lt::socket_type_t::utp_ssl:
return QLatin1String("UTP_SSL");
}
return QLatin1String("INVALID");
#endif
}
QString toString(const lt::address &address)
{
try {
return QString::fromLatin1(address.to_string().c_str());
}
catch (const std::exception &) {
// suppress conversion error
}
return {};
}
template <typename T> template <typename T>
struct LowerLimited struct LowerLimited
{ {
@ -1041,7 +1076,7 @@ void Session::processBannedIPs(lt::ip_filter &filter)
// First, import current filter // First, import current filter
for (const QString &ip : asConst(m_bannedIPs.value())) { for (const QString &ip : asConst(m_bannedIPs.value())) {
lt::error_code ec; lt::error_code ec;
const lt::address addr = lt::address::from_string(ip.toLatin1().constData(), ec); const lt::address addr = lt::make_address(ip.toLatin1().constData(), ec);
Q_ASSERT(!ec); Q_ASSERT(!ec);
if (!ec) if (!ec)
filter.add_rule(addr, addr, lt::ip_filter::blocked); filter.add_rule(addr, addr, lt::ip_filter::blocked);
@ -1418,7 +1453,7 @@ void Session::configureNetworkInterfaces(lt::settings_pack &settingsPack)
void Session::configurePeerClasses() void Session::configurePeerClasses()
{ {
lt::ip_filter f; lt::ip_filter f;
// address_v4::from_string("255.255.255.255") crashes on some people's systems // lt::make_address("255.255.255.255") crashes on some people's systems
// so instead we use address_v4::broadcast() // so instead we use address_v4::broadcast()
// Proactively do the same for 0.0.0.0 and address_v4::any() // Proactively do the same for 0.0.0.0 and address_v4::any()
f.add_rule(lt::address_v4::any() f.add_rule(lt::address_v4::any()
@ -1430,29 +1465,29 @@ void Session::configurePeerClasses()
// Affects Windows XP // Affects Windows XP
try { try {
f.add_rule(lt::address_v6::any() f.add_rule(lt::address_v6::any()
, lt::address_v6::from_string("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff") , lt::make_address("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff")
, 1 << static_cast<LTUnderlyingType<lt::peer_class_t>>(lt::session::global_peer_class_id)); , 1 << static_cast<LTUnderlyingType<lt::peer_class_t>>(lt::session::global_peer_class_id));
} }
catch (const std::exception &) {} catch (const std::exception &) {}
if (ignoreLimitsOnLAN()) { if (ignoreLimitsOnLAN()) {
// local networks // local networks
f.add_rule(lt::address_v4::from_string("10.0.0.0") f.add_rule(lt::make_address("10.0.0.0")
, lt::address_v4::from_string("10.255.255.255") , lt::make_address("10.255.255.255")
, 1 << static_cast<LTUnderlyingType<lt::peer_class_t>>(lt::session::local_peer_class_id)); , 1 << static_cast<LTUnderlyingType<lt::peer_class_t>>(lt::session::local_peer_class_id));
f.add_rule(lt::address_v4::from_string("172.16.0.0") f.add_rule(lt::make_address("172.16.0.0")
, lt::address_v4::from_string("172.31.255.255") , lt::make_address("172.31.255.255")
, 1 << static_cast<LTUnderlyingType<lt::peer_class_t>>(lt::session::local_peer_class_id)); , 1 << static_cast<LTUnderlyingType<lt::peer_class_t>>(lt::session::local_peer_class_id));
f.add_rule(lt::address_v4::from_string("192.168.0.0") f.add_rule(lt::make_address("192.168.0.0")
, lt::address_v4::from_string("192.168.255.255") , lt::make_address("192.168.255.255")
, 1 << static_cast<LTUnderlyingType<lt::peer_class_t>>(lt::session::local_peer_class_id)); , 1 << static_cast<LTUnderlyingType<lt::peer_class_t>>(lt::session::local_peer_class_id));
// link local // link local
f.add_rule(lt::address_v4::from_string("169.254.0.0") f.add_rule(lt::make_address("169.254.0.0")
, lt::address_v4::from_string("169.254.255.255") , lt::make_address("169.254.255.255")
, 1 << static_cast<LTUnderlyingType<lt::peer_class_t>>(lt::session::local_peer_class_id)); , 1 << static_cast<LTUnderlyingType<lt::peer_class_t>>(lt::session::local_peer_class_id));
// loopback // loopback
f.add_rule(lt::address_v4::from_string("127.0.0.0") f.add_rule(lt::make_address("127.0.0.0")
, lt::address_v4::from_string("127.255.255.255") , lt::make_address("127.255.255.255")
, 1 << static_cast<LTUnderlyingType<lt::peer_class_t>>(lt::session::local_peer_class_id)); , 1 << static_cast<LTUnderlyingType<lt::peer_class_t>>(lt::session::local_peer_class_id));
// IPv6 may not be available on OS and the parsing // IPv6 may not be available on OS and the parsing
@ -1460,12 +1495,12 @@ void Session::configurePeerClasses()
// Affects Windows XP // Affects Windows XP
try { try {
// link local // link local
f.add_rule(lt::address_v6::from_string("fe80::") f.add_rule(lt::make_address("fe80::")
, lt::address_v6::from_string("febf:ffff:ffff:ffff:ffff:ffff:ffff:ffff") , lt::make_address("febf:ffff:ffff:ffff:ffff:ffff:ffff:ffff")
, 1 << static_cast<LTUnderlyingType<lt::peer_class_t>>(lt::session::local_peer_class_id)); , 1 << static_cast<LTUnderlyingType<lt::peer_class_t>>(lt::session::local_peer_class_id));
// unique local addresses // unique local addresses
f.add_rule(lt::address_v6::from_string("fc00::") f.add_rule(lt::make_address("fc00::")
, lt::address_v6::from_string("fdff:ffff:ffff:ffff:ffff:ffff:ffff:ffff") , lt::make_address("fdff:ffff:ffff:ffff:ffff:ffff:ffff:ffff")
, 1 << static_cast<LTUnderlyingType<lt::peer_class_t>>(lt::session::local_peer_class_id)); , 1 << static_cast<LTUnderlyingType<lt::peer_class_t>>(lt::session::local_peer_class_id));
// loopback // loopback
f.add_rule(lt::address_v6::loopback() f.add_rule(lt::address_v6::loopback()
@ -1651,7 +1686,7 @@ void Session::banIP(const QString &ip)
if (!bannedIPs.contains(ip)) { if (!bannedIPs.contains(ip)) {
lt::ip_filter filter = m_nativeSession->get_ip_filter(); lt::ip_filter filter = m_nativeSession->get_ip_filter();
lt::error_code ec; lt::error_code ec;
const lt::address addr = lt::address::from_string(ip.toLatin1().constData(), ec); const lt::address addr = lt::make_address(ip.toLatin1().constData(), ec);
Q_ASSERT(!ec); Q_ASSERT(!ec);
if (ec) return; if (ec) return;
filter.add_rule(addr, addr, lt::ip_filter::blocked); filter.add_rule(addr, addr, lt::ip_filter::blocked);
@ -4448,8 +4483,6 @@ void Session::handlePortmapAlert(const lt::portmap_alert *p)
void Session::handlePeerBlockedAlert(const lt::peer_blocked_alert *p) void Session::handlePeerBlockedAlert(const lt::peer_blocked_alert *p)
{ {
lt::error_code ec;
const std::string ip = p->endpoint.address().to_string(ec);
QString reason; QString reason;
switch (p->reason) { switch (p->reason) {
case lt::peer_blocked_alert::ip_filter: case lt::peer_blocked_alert::ip_filter:
@ -4472,17 +4505,16 @@ void Session::handlePeerBlockedAlert(const lt::peer_blocked_alert *p)
break; break;
} }
if (!ec) const QString ip {toString(p->endpoint.address())};
Logger::instance()->addPeer(QString::fromLatin1(ip.c_str()), true, reason); if (!ip.isEmpty())
Logger::instance()->addPeer(ip, true, reason);
} }
void Session::handlePeerBanAlert(const lt::peer_ban_alert *p) void Session::handlePeerBanAlert(const lt::peer_ban_alert *p)
{ {
lt::error_code ec; const QString ip {toString(p->endpoint.address())};
const std::string ip = p->endpoint.address().to_string(ec); if (!ip.isEmpty())
Logger::instance()->addPeer(ip, false);
if (!ec)
Logger::instance()->addPeer(QString::fromLatin1(ip.c_str()), false);
} }
void Session::handleUrlSeedAlert(const lt::url_seed_alert *p) void Session::handleUrlSeedAlert(const lt::url_seed_alert *p)
@ -4505,33 +4537,10 @@ void Session::handleUrlSeedAlert(const lt::url_seed_alert *p)
void Session::handleListenSucceededAlert(const lt::listen_succeeded_alert *p) void Session::handleListenSucceededAlert(const lt::listen_succeeded_alert *p)
{ {
QString proto = "INVALID"; const QString proto {toString(p->socket_type)};
switch (p->socket_type)
{
case lt::socket_type_t::udp:
proto = "UDP";
break;
case lt::socket_type_t::tcp:
proto = "TCP";
break;
case lt::socket_type_t::tcp_ssl:
proto = "TCP_SSL";
break;
case lt::socket_type_t::i2p:
proto = "I2P";
break;
case lt::socket_type_t::socks5:
proto = "SOCKS5";
break;
case lt::socket_type_t::utp_ssl:
proto = "UTP_SSL";
break;
}
lt::error_code ec;
LogMsg(tr("Successfully listening on IP: %1, port: %2/%3" LogMsg(tr("Successfully listening on IP: %1, port: %2/%3"
, "e.g: Successfully listening on IP: 192.168.0.1, port: TCP/6881") , "e.g: Successfully listening on IP: 192.168.0.1, port: TCP/6881")
.arg(p->address.to_string(ec).c_str(), proto, QString::number(p->port)), Log::INFO); .arg(toString(p->address), proto, QString::number(p->port)), Log::INFO);
// Force reannounce on all torrents because some trackers blacklist some ports // Force reannounce on all torrents because some trackers blacklist some ports
for (const lt::torrent_handle &torrent : m_nativeSession->get_torrents()) for (const lt::torrent_handle &torrent : m_nativeSession->get_torrents())
@ -4540,41 +4549,17 @@ void Session::handleListenSucceededAlert(const lt::listen_succeeded_alert *p)
void Session::handleListenFailedAlert(const lt::listen_failed_alert *p) void Session::handleListenFailedAlert(const lt::listen_failed_alert *p)
{ {
QString proto = "INVALID"; const QString proto {toString(p->socket_type)};
switch (p->socket_type)
{
case lt::socket_type_t::udp:
proto = "UDP";
break;
case lt::socket_type_t::tcp:
proto = "TCP";
break;
case lt::socket_type_t::tcp_ssl:
proto = "TCP_SSL";
break;
case lt::socket_type_t::i2p:
proto = "I2P";
break;
case lt::socket_type_t::socks5:
proto = "SOCKS5";
break;
case lt::socket_type_t::utp_ssl:
proto = "UTP_SSL";
break;
}
lt::error_code ec;
LogMsg(tr("Failed to listen on IP: %1, port: %2/%3. Reason: %4" LogMsg(tr("Failed to listen on IP: %1, port: %2/%3. Reason: %4"
, "e.g: Failed to listen on IP: 192.168.0.1, port: TCP/6881. Reason: already in use") , "e.g: Failed to listen on IP: 192.168.0.1, port: TCP/6881. Reason: already in use")
.arg(p->address.to_string(ec).c_str(), proto, QString::number(p->port) .arg(toString(p->address), proto, QString::number(p->port)
, QString::fromLocal8Bit(p->error.message().c_str())), Log::CRITICAL); , QString::fromLocal8Bit(p->error.message().c_str())), Log::CRITICAL);
} }
void Session::handleExternalIPAlert(const lt::external_ip_alert *p) void Session::handleExternalIPAlert(const lt::external_ip_alert *p)
{ {
lt::error_code ec;
LogMsg(tr("Detected external IP: %1", "e.g. Detected external IP: 1.1.1.1") LogMsg(tr("Detected external IP: %1", "e.g. Detected external IP: 1.1.1.1")
.arg(p->external_address.to_string(ec).c_str()), Log::INFO); .arg(toString(p->external_address)), Log::INFO);
} }
void Session::handleSessionStatsAlert(const lt::session_stats_alert *p) void Session::handleSessionStatsAlert(const lt::session_stats_alert *p)