From 70f4303d92a3666c4b9de36b922f1b47baf35ce5 Mon Sep 17 00:00:00 2001 From: Arvid Norberg Date: Mon, 1 Dec 2008 08:48:54 +0000 Subject: [PATCH] added tracker IP to tracker_response callback and added filtering of local IPs in pex and tracker responses. #409 --- include/libtorrent/http_tracker_connection.hpp | 3 ++- include/libtorrent/torrent.hpp | 1 + include/libtorrent/tracker_manager.hpp | 1 + src/http_tracker_connection.cpp | 14 ++++++++++++-- src/torrent.cpp | 3 +++ src/udp_tracker_connection.cpp | 2 +- src/ut_pex.cpp | 5 +++++ 7 files changed, 25 insertions(+), 4 deletions(-) diff --git a/include/libtorrent/http_tracker_connection.hpp b/include/libtorrent/http_tracker_connection.hpp index f71baa0d0..d94637d54 100644 --- a/include/libtorrent/http_tracker_connection.hpp +++ b/include/libtorrent/http_tracker_connection.hpp @@ -85,7 +85,7 @@ namespace libtorrent { return boost::intrusive_ptr(this); } void on_filter(http_connection& c, std::list& endpoints); - + void on_connect(http_connection& c); void on_response(error_code const& ec, http_parser const& parser , char const* data, int size); @@ -98,6 +98,7 @@ namespace libtorrent boost::shared_ptr m_tracker_connection; aux::session_impl const& m_ses; address m_bind_iface; + address m_tracker_ip; proxy_settings const& m_ps; connection_queue& m_cc; io_service& m_ios; diff --git a/include/libtorrent/torrent.hpp b/include/libtorrent/torrent.hpp index 82b57ea4e..f6c640f0b 100644 --- a/include/libtorrent/torrent.hpp +++ b/include/libtorrent/torrent.hpp @@ -373,6 +373,7 @@ namespace libtorrent // or when a failure occured virtual void tracker_response( tracker_request const& r + , address const& tracker_ip , std::vector& e, int interval , int complete, int incomplete, address const& external_ip); virtual void tracker_request_timed_out( diff --git a/include/libtorrent/tracker_manager.hpp b/include/libtorrent/tracker_manager.hpp index 6ae356c53..0c0ec07a0 100644 --- a/include/libtorrent/tracker_manager.hpp +++ b/include/libtorrent/tracker_manager.hpp @@ -122,6 +122,7 @@ namespace libtorrent , int complete, int incomplete, int downloads) {} virtual void tracker_response( tracker_request const& req + , address const& tracker_ip , std::vector& peers , int interval , int complete diff --git a/src/http_tracker_connection.cpp b/src/http_tracker_connection.cpp index 01487013a..c22c99b33 100644 --- a/src/http_tracker_connection.cpp +++ b/src/http_tracker_connection.cpp @@ -178,7 +178,8 @@ namespace libtorrent m_tracker_connection.reset(new http_connection(m_ios, m_cc , boost::bind(&http_tracker_connection::on_response, self(), _1, _2, _3, _4) - , true, http_connect_handler() + , true + , boost::bind(&http_tracker_connection::on_connect, self(), _1) , boost::bind(&http_tracker_connection::on_filter, self(), _1, _2))); int timeout = tracker_req().event==tracker_request::stopped @@ -223,6 +224,15 @@ namespace libtorrent fail(-1, "blocked by IP filter"); } + void http_tracker_connection::on_connect(http_connection& c) + { + error_code ec; + tcp::endpoint ep = c.socket().remote_endpoint(ec); + m_tracker_ip = ep.address(); + boost::shared_ptr cb = requester(); + if (cb) cb->m_tracker_address = ep; + } + void http_tracker_connection::on_response(error_code const& ec , http_parser const& parser, char const* data, int size) { @@ -466,7 +476,7 @@ namespace libtorrent if (incomplete_ent && incomplete_ent->type() == entry::int_t) incomplete = int(incomplete_ent->integer()); - cb->tracker_response(tracker_req(), peer_list, interval->integer(), complete + cb->tracker_response(tracker_req(), m_tracker_ip, peer_list, interval->integer(), complete , incomplete, external_ip); } diff --git a/src/torrent.cpp b/src/torrent.cpp index 26852d0c9..e8d3fe706 100644 --- a/src/torrent.cpp +++ b/src/torrent.cpp @@ -1020,6 +1020,7 @@ namespace libtorrent void torrent::tracker_response( tracker_request const& r + , address const& tracker_ip , std::vector& peer_list , int interval , int complete @@ -1098,6 +1099,8 @@ namespace libtorrent } else { + // ignore local addresses from the tracker (unless the tracker is local too) + if (is_local(a.address()) && !is_local(tracker_ip)) continue; m_policy.peer_from_tracker(a, i->pid, peer_info::tracker, 0); } } diff --git a/src/udp_tracker_connection.cpp b/src/udp_tracker_connection.cpp index e1f7771e1..ecce3f2c3 100644 --- a/src/udp_tracker_connection.cpp +++ b/src/udp_tracker_connection.cpp @@ -417,7 +417,7 @@ namespace libtorrent peer_list.push_back(e); } - cb->tracker_response(tracker_req(), peer_list, interval + cb->tracker_response(tracker_req(), m_target.address(), peer_list, interval , complete, incomplete, address()); m_man.remove_request(this); diff --git a/src/ut_pex.cpp b/src/ut_pex.cpp index ccf2b53e7..f71ea3d86 100644 --- a/src/ut_pex.cpp +++ b/src/ut_pex.cpp @@ -47,6 +47,7 @@ POSSIBILITY OF SUCH DAMAGE. #include "libtorrent/bencode.hpp" #include "libtorrent/torrent.hpp" #include "libtorrent/extensions.hpp" +#include "libtorrent/broadcast_socket.hpp" #include "libtorrent/extensions/ut_pex.hpp" @@ -258,6 +259,8 @@ namespace libtorrent { namespace { tcp::endpoint adr = detail::read_v4_endpoint(in); char flags = *fin++; + // ignore local addresses unless the peer is local to us + if (is_local(adr.address()) && !is_local(m_pc.remote().address())) continue; p.peer_from_tracker(adr, pid, peer_info::pex, flags); } } @@ -280,6 +283,8 @@ namespace libtorrent { namespace { tcp::endpoint adr = detail::read_v6_endpoint(in); char flags = *fin++; + // ignore local addresses unless the peer is local to us + if (is_local(adr.address()) && !is_local(m_pc.remote().address())) continue; p.peer_from_tracker(adr, pid, peer_info::pex, flags); } }