applies ip filter to trackers as well

This commit is contained in:
Arvid Norberg 2008-10-22 19:40:32 +00:00
parent 0ed75c3f64
commit dc6564fa11
7 changed files with 65 additions and 23 deletions

View File

@ -65,7 +65,7 @@ typedef boost::function<void(error_code const&
typedef boost::function<void(http_connection&)> http_connect_handler;
// TODO: add bind interface
typedef boost::function<void(http_connection&, std::list<tcp::endpoint>&)> http_filter_handler;
// when bottled, the last two arguments to the handler
// will always be 0
@ -73,12 +73,14 @@ struct http_connection : boost::enable_shared_from_this<http_connection>, boost:
{
http_connection(io_service& ios, connection_queue& cc
, http_handler const& handler, bool bottled = true
, http_connect_handler const& ch = http_connect_handler())
, http_connect_handler const& ch = http_connect_handler()
, http_filter_handler const& fh = http_filter_handler())
: m_sock(ios)
, m_read_pos(0)
, m_resolver(ios)
, m_handler(handler)
, m_connect_handler(ch)
, m_filter_handler(fh)
, m_timer(ios)
, m_last_receive(time_now())
, m_bottled(bottled)
@ -148,6 +150,7 @@ private:
http_parser m_parser;
http_handler m_handler;
http_connect_handler m_connect_handler;
http_filter_handler m_filter_handler;
deadline_timer m_timer;
time_duration m_timeout;
ptime m_last_receive;

View File

@ -57,6 +57,7 @@ namespace libtorrent
class http_parser;
class connection_queue;
struct session_settings;
namespace aux { struct session_impl; }
class TORRENT_EXPORT http_tracker_connection
: public tracker_connection
@ -71,7 +72,7 @@ namespace libtorrent
, tracker_request const& req
, address bind_infc
, boost::weak_ptr<request_callback> c
, session_settings const& stn
, aux::session_impl const& ses
, proxy_settings const& ps
, std::string const& password = "");
@ -83,6 +84,8 @@ namespace libtorrent
boost::intrusive_ptr<http_tracker_connection> self()
{ return boost::intrusive_ptr<http_tracker_connection>(this); }
void on_filter(http_connection& c, std::list<tcp::endpoint>& endpoints);
void on_response(error_code const& ec, http_parser const& parser
, char const* data, int size);
@ -93,7 +96,7 @@ namespace libtorrent
tracker_manager& m_man;
boost::shared_ptr<http_connection> m_tracker_connection;
session_settings const& m_settings;
aux::session_impl const& m_ses;
address m_bind_iface;
proxy_settings const& m_ps;
connection_queue& m_cc;

View File

@ -59,6 +59,8 @@ POSSIBILITY OF SUCH DAMAGE.
namespace libtorrent
{
namespace aux { struct session_impl; }
class TORRENT_EXPORT udp_tracker_connection: public tracker_connection
{
friend class tracker_manager;
@ -71,7 +73,7 @@ namespace libtorrent
, tracker_request const& req
, address bind_infc
, boost::weak_ptr<request_callback> c
, session_settings const& stn
, aux::session_impl const& ses
, proxy_settings const& ps);
void start();
@ -113,7 +115,7 @@ namespace libtorrent
int m_transaction_id;
boost::int64_t m_connection_id;
session_settings const& m_settings;
aux::session_impl const& m_ses;
int m_attempts;
action_t m_state;

View File

@ -273,6 +273,13 @@ void http_connection::on_resolve(error_code const& e
std::transform(i, tcp::resolver::iterator(), std::back_inserter(m_endpoints)
, boost::bind(&tcp::resolver::iterator::value_type::endpoint, _1));
if (m_filter_handler) m_filter_handler(*this, m_endpoints);
if (m_endpoints.empty())
{
close();
return;
}
// The following statement causes msvc to crash (ICE). Since it's not
// necessary in the vast majority of cases, just ignore the endpoint
// order for windows

View File

@ -60,6 +60,7 @@ POSSIBILITY OF SUCH DAMAGE.
#include "libtorrent/torrent.hpp"
#include "libtorrent/io.hpp"
#include "libtorrent/socket.hpp"
#include "libtorrent/aux_/session_impl.hpp"
using namespace libtorrent;
using boost::bind;
@ -74,12 +75,12 @@ namespace libtorrent
, tracker_request const& req
, address bind_infc
, boost::weak_ptr<request_callback> c
, session_settings const& stn
, aux::session_impl const& ses
, proxy_settings const& ps
, std::string const& auth)
: tracker_connection(man, req, ios, bind_infc, c)
, m_man(man)
, m_settings(stn)
, m_ses(ses)
, m_bind_iface(bind_infc)
, m_ps(ps)
, m_cc(cc)
@ -106,6 +107,8 @@ namespace libtorrent
url.replace(pos, 8, "scrape");
}
session_settings const& settings = m_ses.settings();
// if request-string already contains
// some parameters, append an ampersand instead
// of a question mark
@ -155,10 +158,10 @@ namespace libtorrent
url += boost::lexical_cast<std::string>(
(std::min)(tracker_req().num_want, 999));
if (m_settings.announce_ip != address())
if (settings.announce_ip != address())
{
error_code ec;
std::string ip = m_settings.announce_ip.to_string(ec);
std::string ip = settings.announce_ip.to_string(ec);
if (!ec) url += "&ip=" + ip;
}
@ -174,14 +177,16 @@ 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)));
, boost::bind(&http_tracker_connection::on_response, self(), _1, _2, _3, _4)
, true, http_connect_handler()
, boost::bind(&http_tracker_connection::on_filter, self(), _1, _2)));
int timeout = tracker_req().event==tracker_request::stopped
?m_settings.stop_tracker_timeout
:m_settings.tracker_completion_timeout;
?settings.stop_tracker_timeout
:settings.tracker_completion_timeout;
m_tracker_connection->get(url, seconds(timeout)
, 1, &m_ps, 5, m_settings.user_agent, m_bind_iface);
, 1, &m_ps, 5, settings.user_agent, m_bind_iface);
// the url + 100 estimated header size
sent_bytes(url.size() + 100);
@ -206,6 +211,18 @@ namespace libtorrent
tracker_connection::close();
}
void http_tracker_connection::on_filter(http_connection& c, std::list<tcp::endpoint>& endpoints)
{
// remove endpoints that are filtered by the IP filter
endpoints.erase(std::remove_if(endpoints.begin(), endpoints.end()
, boost::bind(&ip_filter::access, boost::ref(m_ses.m_ip_filter)
, boost::bind(&tcp::endpoint::address, _1)) == ip_filter::blocked)
, endpoints.end());
if (endpoints.empty())
fail(-1, "blocked by IP filter");
}
void http_tracker_connection::on_response(error_code const& ec
, http_parser const& parser, char const* data, int size)
{

View File

@ -232,13 +232,13 @@ namespace libtorrent
{
con = new http_tracker_connection(
ios, cc, *this, req, bind_infc, c
, m_ses.settings(), m_proxy, auth);
, m_ses, m_proxy, auth);
}
else if (protocol == "udp")
{
con = new udp_tracker_connection(
ios, cc, *this, req, bind_infc
, c, m_ses.settings(), m_proxy);
, c, m_ses, m_proxy);
}
else
{

View File

@ -55,6 +55,7 @@ POSSIBILITY OF SUCH DAMAGE.
#include "libtorrent/parse_url.hpp"
#include "libtorrent/udp_tracker_connection.hpp"
#include "libtorrent/io.hpp"
#include "libtorrent/aux_/session_impl.hpp"
namespace
{
@ -80,7 +81,7 @@ namespace libtorrent
, tracker_request const& req
, address bind_infc
, boost::weak_ptr<request_callback> c
, session_settings const& stn
, aux::session_impl const& ses
, proxy_settings const& proxy)
: tracker_connection(man, req, ios, bind_infc, c)
, m_man(man)
@ -88,7 +89,7 @@ namespace libtorrent
, m_socket(ios, boost::bind(&udp_tracker_connection::on_receive, self(), _1, _2, _3, _4), cc)
, m_transaction_id(0)
, m_connection_id(0)
, m_settings(stn)
, m_ses(ses)
, m_attempts(0)
, m_state(action_error)
{
@ -111,14 +112,16 @@ namespace libtorrent
return;
}
session_settings const& settings = m_ses.settings();
udp::resolver::query q(hostname, boost::lexical_cast<std::string>(port));
m_name_lookup.async_resolve(q
, boost::bind(
&udp_tracker_connection::name_lookup, self(), _1, _2));
set_timeout(tracker_req().event == tracker_request::stopped
? m_settings.stop_tracker_timeout
: m_settings.tracker_completion_timeout
, m_settings.tracker_receive_timeout);
? settings.stop_tracker_timeout
: settings.tracker_completion_timeout
, settings.tracker_receive_timeout);
#if defined TORRENT_VERBOSE_LOGGING || defined TORRENT_LOGGING
boost::shared_ptr<request_callback> cb = requester();
if (cb) cb->debug_log(("*** UDP_TRACKER [ initiating name lookup: " + hostname + " ]").c_str());
@ -165,6 +168,12 @@ namespace libtorrent
{
target_address = *target;
}
if (m_ses.m_ip_filter.access(target_address.address()) & ip_filter::blocked)
{
fail(-1, "blocked by IP filter");
return;
}
if (cb) cb->m_tracker_address = tcp::endpoint(target_address.address(), target_address.port());
m_target = target_address;
@ -476,6 +485,7 @@ namespace libtorrent
char* out = buf;
tracker_request const& req = tracker_req();
session_settings const& settings = m_ses.settings();
detail::write_int64(m_connection_id, out); // connection_id
detail::write_int32(action_announce, out); // action (announce)
@ -489,8 +499,8 @@ namespace libtorrent
detail::write_int64(req.uploaded, out); // uploaded
detail::write_int32(req.event, out); // event
// ip address
if (m_settings.announce_ip != address() && m_settings.announce_ip.is_v4())
detail::write_uint32(m_settings.announce_ip.to_v4().to_ulong(), out);
if (settings.announce_ip != address() && settings.announce_ip.is_v4())
detail::write_uint32(settings.announce_ip.to_v4().to_ulong(), out);
else
detail::write_int32(0, out);
detail::write_int32(req.key, out); // key