forked from premiere/premiere-libtorrent
make sure &key= stays consistent between different source IPs (as mandated by BEP7)
This commit is contained in:
parent
7320568c3c
commit
e18366bb6b
|
@ -1,3 +1,4 @@
|
||||||
|
* make sure &key= stays consistent between different source IPs (as mandated by BEP7)
|
||||||
* fix binding sockets to outgoing interface
|
* fix binding sockets to outgoing interface
|
||||||
* add new socks5_alert to trouble shoot SOCKS5 proxies
|
* add new socks5_alert to trouble shoot SOCKS5 proxies
|
||||||
|
|
||||||
|
|
|
@ -221,10 +221,6 @@ namespace aux {
|
||||||
|
|
||||||
std::shared_ptr<natpmp> natpmp_mapper;
|
std::shared_ptr<natpmp> natpmp_mapper;
|
||||||
|
|
||||||
// the key is an id that is used to identify the
|
|
||||||
// client with the tracker only.
|
|
||||||
std::uint32_t tracker_key = 0;
|
|
||||||
|
|
||||||
// set to true when we receive an incoming connection from this listen
|
// set to true when we receive an incoming connection from this listen
|
||||||
// socket
|
// socket
|
||||||
bool incoming_connection = false;
|
bool incoming_connection = false;
|
||||||
|
@ -630,8 +626,6 @@ namespace aux {
|
||||||
// or zero if no matching listen socket is found
|
// or zero if no matching listen socket is found
|
||||||
int listen_port(transport ssl, address const& local_addr) override;
|
int listen_port(transport ssl, address const& local_addr) override;
|
||||||
|
|
||||||
std::uint32_t get_tracker_key(address const& iface) const;
|
|
||||||
|
|
||||||
void for_each_listen_socket(std::function<void(aux::listen_socket_handle const&)> f) override
|
void for_each_listen_socket(std::function<void(aux::listen_socket_handle const&)> f) override
|
||||||
{
|
{
|
||||||
for (auto& s : m_listen_sockets)
|
for (auto& s : m_listen_sockets)
|
||||||
|
|
|
@ -1108,8 +1108,8 @@ TORRENT_TEST(tracker_key_argument)
|
||||||
, [](torrent_handle h) {}
|
, [](torrent_handle h) {}
|
||||||
, [](torrent_handle h) {});
|
, [](torrent_handle h) {});
|
||||||
|
|
||||||
// make sure we got two separate keys, one for each listen socket interface
|
// make sure we got the same key for all listen socket interface
|
||||||
TEST_EQUAL(keys.size(), 2);
|
TEST_EQUAL(keys.size(), 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// make sure we do _not_ send our IPv6 address to trackers for non-private
|
// make sure we do _not_ send our IPv6 address to trackers for non-private
|
||||||
|
|
|
@ -1067,8 +1067,6 @@ namespace aux {
|
||||||
{
|
{
|
||||||
auto ls = req.outgoing_socket.get();
|
auto ls = req.outgoing_socket.get();
|
||||||
|
|
||||||
req.key ^= ls->tracker_key;
|
|
||||||
|
|
||||||
req.listen_port =
|
req.listen_port =
|
||||||
#ifdef TORRENT_USE_OPENSSL
|
#ifdef TORRENT_USE_OPENSSL
|
||||||
// SSL torrents use the SSL listen port
|
// SSL torrents use the SSL listen port
|
||||||
|
@ -1092,9 +1090,6 @@ namespace aux {
|
||||||
#endif
|
#endif
|
||||||
listen_port(ls.get());
|
listen_port(ls.get());
|
||||||
|
|
||||||
// we combine the per-torrent key with the per-interface key to make
|
|
||||||
// them consistent and unique per torrent and interface
|
|
||||||
socket_req.key ^= ls->tracker_key;
|
|
||||||
socket_req.outgoing_socket = ls;
|
socket_req.outgoing_socket = ls;
|
||||||
m_tracker_manager.queue_request(get_io_service(), std::move(socket_req), c);
|
m_tracker_manager.queue_request(get_io_service(), std::move(socket_req), c);
|
||||||
}
|
}
|
||||||
|
@ -1315,27 +1310,6 @@ namespace aux {
|
||||||
reopen_outgoing_sockets();
|
reopen_outgoing_sockets();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::uint32_t session_impl::get_tracker_key(address const& iface) const
|
|
||||||
{
|
|
||||||
auto const ses = reinterpret_cast<uintptr_t>(this);
|
|
||||||
hasher h(reinterpret_cast<char const*>(&ses), sizeof(ses));
|
|
||||||
if (iface.is_v4())
|
|
||||||
{
|
|
||||||
auto const b = iface.to_v4().to_bytes();
|
|
||||||
h.update({reinterpret_cast<char const*>(b.data())
|
|
||||||
, std::ptrdiff_t(b.size())});
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
auto const b = iface.to_v6().to_bytes();
|
|
||||||
h.update({reinterpret_cast<char const*>(b.data())
|
|
||||||
, std::ptrdiff_t(b.size())});
|
|
||||||
}
|
|
||||||
sha1_hash const hash = h.final();
|
|
||||||
unsigned char const* ptr = &hash[0];
|
|
||||||
return detail::read_uint32(ptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::shared_ptr<listen_socket_t> session_impl::setup_listener(
|
std::shared_ptr<listen_socket_t> session_impl::setup_listener(
|
||||||
listen_endpoint_t const& lep, error_code& ec)
|
listen_endpoint_t const& lep, error_code& ec)
|
||||||
{
|
{
|
||||||
|
@ -1653,7 +1627,6 @@ namespace aux {
|
||||||
ret->local_endpoint = tcp::endpoint(udp_ep.address(), udp_ep.port());
|
ret->local_endpoint = tcp::endpoint(udp_ep.address(), udp_ep.port());
|
||||||
}
|
}
|
||||||
|
|
||||||
ret->tracker_key = get_tracker_key(ret->local_endpoint.address());
|
|
||||||
ret->device = lep.device;
|
ret->device = lep.device;
|
||||||
|
|
||||||
error_code err;
|
error_code err;
|
||||||
|
|
Loading…
Reference in New Issue