forked from premiere/premiere-libtorrent
added peer_blocked_alert which is generated when a peer is blocked by the IP filter. Fixed the ip-filter parsing in client_test and made it report the peer_blocked_alert. Added documentation.
This commit is contained in:
parent
32dc04c09b
commit
849db39472
|
@ -137,34 +137,35 @@
|
|||
<li><a class="reference" href="#metadata-failed-alert" id="id114" name="id114">metadata_failed_alert</a></li>
|
||||
<li><a class="reference" href="#metadata-received-alert" id="id115" name="id115">metadata_received_alert</a></li>
|
||||
<li><a class="reference" href="#fastresume-rejected-alert" id="id116" name="id116">fastresume_rejected_alert</a></li>
|
||||
<li><a class="reference" href="#dispatcher" id="id117" name="id117">dispatcher</a></li>
|
||||
<li><a class="reference" href="#peer-blocked-alert" id="id117" name="id117">peer_blocked_alert</a></li>
|
||||
<li><a class="reference" href="#dispatcher" id="id118" name="id118">dispatcher</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a class="reference" href="#exceptions" id="id118" name="id118">exceptions</a><ul>
|
||||
<li><a class="reference" href="#invalid-handle" id="id119" name="id119">invalid_handle</a></li>
|
||||
<li><a class="reference" href="#duplicate-torrent" id="id120" name="id120">duplicate_torrent</a></li>
|
||||
<li><a class="reference" href="#invalid-encoding" id="id121" name="id121">invalid_encoding</a></li>
|
||||
<li><a class="reference" href="#type-error" id="id122" name="id122">type_error</a></li>
|
||||
<li><a class="reference" href="#invalid-torrent-file" id="id123" name="id123">invalid_torrent_file</a></li>
|
||||
<li><a class="reference" href="#exceptions" id="id119" name="id119">exceptions</a><ul>
|
||||
<li><a class="reference" href="#invalid-handle" id="id120" name="id120">invalid_handle</a></li>
|
||||
<li><a class="reference" href="#duplicate-torrent" id="id121" name="id121">duplicate_torrent</a></li>
|
||||
<li><a class="reference" href="#invalid-encoding" id="id122" name="id122">invalid_encoding</a></li>
|
||||
<li><a class="reference" href="#type-error" id="id123" name="id123">type_error</a></li>
|
||||
<li><a class="reference" href="#invalid-torrent-file" id="id124" name="id124">invalid_torrent_file</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a class="reference" href="#fast-resume" id="id124" name="id124">fast resume</a><ul>
|
||||
<li><a class="reference" href="#file-format" id="id125" name="id125">file format</a></li>
|
||||
<li><a class="reference" href="#fast-resume" id="id125" name="id125">fast resume</a><ul>
|
||||
<li><a class="reference" href="#file-format" id="id126" name="id126">file format</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a class="reference" href="#threads" id="id126" name="id126">threads</a></li>
|
||||
<li><a class="reference" href="#storage-allocation" id="id127" name="id127">storage allocation</a><ul>
|
||||
<li><a class="reference" href="#full-allocation" id="id128" name="id128">full allocation</a></li>
|
||||
<li><a class="reference" href="#compact-allocation" id="id129" name="id129">compact allocation</a></li>
|
||||
<li><a class="reference" href="#threads" id="id127" name="id127">threads</a></li>
|
||||
<li><a class="reference" href="#storage-allocation" id="id128" name="id128">storage allocation</a><ul>
|
||||
<li><a class="reference" href="#full-allocation" id="id129" name="id129">full allocation</a></li>
|
||||
<li><a class="reference" href="#compact-allocation" id="id130" name="id130">compact allocation</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a class="reference" href="#extensions" id="id130" name="id130">extensions</a><ul>
|
||||
<li><a class="reference" href="#metadata-from-peers" id="id131" name="id131">metadata from peers</a></li>
|
||||
<li><a class="reference" href="#http-seeding" id="id132" name="id132">HTTP seeding</a></li>
|
||||
<li><a class="reference" href="#extensions" id="id131" name="id131">extensions</a><ul>
|
||||
<li><a class="reference" href="#metadata-from-peers" id="id132" name="id132">metadata from peers</a></li>
|
||||
<li><a class="reference" href="#http-seeding" id="id133" name="id133">HTTP seeding</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a class="reference" href="#filename-checks" id="id133" name="id133">filename checks</a></li>
|
||||
<li><a class="reference" href="#acknowledgments" id="id134" name="id134">acknowledgments</a></li>
|
||||
<li><a class="reference" href="#filename-checks" id="id134" name="id134">filename checks</a></li>
|
||||
<li><a class="reference" href="#acknowledgments" id="id135" name="id135">acknowledgments</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="section">
|
||||
|
@ -486,6 +487,8 @@ void set_ip_filter(ip_filter const& filter);
|
|||
connections based on their originating ip address. The default filter will allow
|
||||
connections to any ip address. To build a set of rules for which addresses are
|
||||
accepted and not, see <a class="reference" href="#ip-filter">ip_filter</a>.</p>
|
||||
<p>Each time a peer is blocked because of the IP filter, a <a class="reference" href="#peer-blocked-alert">peer_blocked_alert</a> is
|
||||
generated.</p>
|
||||
</div>
|
||||
<div class="section">
|
||||
<h2><a id="status" name="status">status()</a></h2>
|
||||
|
@ -2883,6 +2886,22 @@ struct fastresume_rejected_alert: torrent_alert
|
|||
</pre>
|
||||
</div>
|
||||
<div class="section">
|
||||
<h2><a id="peer-blocked-alert" name="peer-blocked-alert">peer_blocked_alert</a></h2>
|
||||
<p>This alert is generated when a peer is blocked by the IP filter. It has the severity leve
|
||||
<tt class="docutils literal"><span class="pre">info</span></tt>. The <tt class="docutils literal"><span class="pre">ip</span></tt> member is the address that was blocked.</p>
|
||||
<pre class="literal-block">
|
||||
struct peer_blocked_alert: alert
|
||||
{
|
||||
peer_blocked_alert(address const& ip_
|
||||
, std::string const& msg);
|
||||
|
||||
address ip;
|
||||
|
||||
virtual std::auto_ptr<alert> clone() const;
|
||||
};
|
||||
</pre>
|
||||
</div>
|
||||
<div class="section">
|
||||
<h2><a id="dispatcher" name="dispatcher">dispatcher</a></h2>
|
||||
<p>The <tt class="docutils literal"><span class="pre">handle_alert</span></tt> class is defined in <tt class="docutils literal"><span class="pre"><libtorrent/alert.hpp></span></tt>.</p>
|
||||
<p>Examples usage:</p>
|
||||
|
|
|
@ -345,6 +345,9 @@ connections based on their originating ip address. The default filter will allow
|
|||
connections to any ip address. To build a set of rules for which addresses are
|
||||
accepted and not, see ip_filter_.
|
||||
|
||||
Each time a peer is blocked because of the IP filter, a peer_blocked_alert_ is
|
||||
generated.
|
||||
|
||||
|
||||
status()
|
||||
--------
|
||||
|
@ -2970,6 +2973,24 @@ resume file was rejected. It is generated at severity level ``warning``.
|
|||
};
|
||||
|
||||
|
||||
peer_blocked_alert
|
||||
------------------
|
||||
|
||||
This alert is generated when a peer is blocked by the IP filter. It has the severity leve
|
||||
``info``. The ``ip`` member is the address that was blocked.
|
||||
|
||||
::
|
||||
|
||||
struct peer_blocked_alert: alert
|
||||
{
|
||||
peer_blocked_alert(address const& ip_
|
||||
, std::string const& msg);
|
||||
|
||||
address ip;
|
||||
|
||||
virtual std::auto_ptr<alert> clone() const;
|
||||
};
|
||||
|
||||
|
||||
dispatcher
|
||||
----------
|
||||
|
|
|
@ -673,15 +673,16 @@ int main(int ac, char* av[])
|
|||
if (line[0] == '#') continue;
|
||||
int a, b, c, d;
|
||||
char dummy;
|
||||
in >> a >> dummy >> b >> dummy >> c >> dummy >> d >> dummy;
|
||||
std::stringstream ln(line);
|
||||
ln >> a >> dummy >> b >> dummy >> c >> dummy >> d >> dummy;
|
||||
address_v4 start((a << 24) + (b << 16) + (c << 8) + d);
|
||||
in >> a >> dummy >> b >> dummy >> c >> dummy >> d >> dummy;
|
||||
ln >> a >> dummy >> b >> dummy >> c >> dummy >> d >> dummy;
|
||||
address_v4 last((a << 24) + (b << 16) + (c << 8) + d);
|
||||
int flags;
|
||||
in >> flags;
|
||||
ln >> flags;
|
||||
if (flags <= 127) flags = ip_filter::blocked;
|
||||
else flags = 0;
|
||||
if (in.fail()) break;
|
||||
if (ln.fail()) break;
|
||||
filter.add_rule(start, last, flags);
|
||||
}
|
||||
ses.set_ip_filter(filter);
|
||||
|
@ -835,6 +836,10 @@ int main(int ac, char* av[])
|
|||
{
|
||||
event_string << "web seed '" << p->url << "': " << p->msg();
|
||||
}
|
||||
else if (peer_blocked_alert* p = dynamic_cast<peer_blocked_alert*>(a.get()))
|
||||
{
|
||||
event_string << "(" << p->ip << ") " << p->msg();
|
||||
}
|
||||
else
|
||||
{
|
||||
event_string << a->msg();
|
||||
|
|
|
@ -57,7 +57,9 @@ POSSIBILITY OF SUCH DAMAGE.
|
|||
#include "libtorrent/time.hpp"
|
||||
#include "libtorrent/config.hpp"
|
||||
|
||||
#define TORRENT_MAX_ALERT_TYPES 10
|
||||
#ifndef TORRENT_MAX_ALERT_TYPES
|
||||
#define TORRENT_MAX_ALERT_TYPES 15
|
||||
#endif
|
||||
|
||||
namespace libtorrent {
|
||||
|
||||
|
@ -72,7 +74,7 @@ namespace libtorrent {
|
|||
// a timestamp is automatically created in the constructor
|
||||
ptime timestamp() const;
|
||||
|
||||
const std::string& msg() const;
|
||||
std::string const& msg() const;
|
||||
|
||||
severity_t severity() const;
|
||||
|
||||
|
@ -112,57 +114,45 @@ namespace libtorrent {
|
|||
|
||||
struct void_;
|
||||
|
||||
template<
|
||||
class Handler
|
||||
, BOOST_PP_ENUM_PARAMS(TORRENT_MAX_ALERT_TYPES, class T)
|
||||
>
|
||||
template<class Handler
|
||||
, BOOST_PP_ENUM_PARAMS(TORRENT_MAX_ALERT_TYPES, class T)>
|
||||
void handle_alert_dispatch(
|
||||
const std::auto_ptr<alert>& alert_
|
||||
, const Handler& handler
|
||||
, const std::type_info& typeid_
|
||||
, BOOST_PP_ENUM_BINARY_PARAMS(TORRENT_MAX_ALERT_TYPES, T, *p))
|
||||
const std::auto_ptr<alert>& alert_, const Handler& handler
|
||||
, const std::type_info& typeid_
|
||||
, BOOST_PP_ENUM_BINARY_PARAMS(TORRENT_MAX_ALERT_TYPES, T, *p))
|
||||
{
|
||||
if (typeid_ == typeid(T0))
|
||||
handler(*static_cast<T0*>(alert_.get()));
|
||||
else
|
||||
handle_alert_dispatch(
|
||||
alert_
|
||||
, handler
|
||||
, typeid_
|
||||
, BOOST_PP_ENUM_SHIFTED_PARAMS(TORRENT_MAX_ALERT_TYPES, p), (void_*)0
|
||||
);
|
||||
handle_alert_dispatch(alert_, handler, typeid_
|
||||
, BOOST_PP_ENUM_SHIFTED_PARAMS(
|
||||
TORRENT_MAX_ALERT_TYPES, p), (void_*)0);
|
||||
}
|
||||
|
||||
template<class Handler>
|
||||
void handle_alert_dispatch(
|
||||
const std::auto_ptr<alert>& alert_
|
||||
, const Handler& handler
|
||||
, const std::type_info& typeid_
|
||||
, BOOST_PP_ENUM_PARAMS(TORRENT_MAX_ALERT_TYPES, void_* BOOST_PP_INTERCEPT))
|
||||
const std::auto_ptr<alert>& alert_
|
||||
, const Handler& handler
|
||||
, const std::type_info& typeid_
|
||||
, BOOST_PP_ENUM_PARAMS(TORRENT_MAX_ALERT_TYPES, void_* BOOST_PP_INTERCEPT))
|
||||
{
|
||||
throw unhandled_alert();
|
||||
}
|
||||
|
||||
} // namespace detail
|
||||
|
||||
template<
|
||||
BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(TORRENT_MAX_ALERT_TYPES, class T, detail::void_)
|
||||
>
|
||||
template<BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(
|
||||
TORRENT_MAX_ALERT_TYPES, class T, detail::void_)>
|
||||
struct TORRENT_EXPORT handle_alert
|
||||
{
|
||||
template<class Handler>
|
||||
handle_alert(
|
||||
const std::auto_ptr<alert>& alert_
|
||||
, const Handler& handler)
|
||||
handle_alert(const std::auto_ptr<alert>& alert_
|
||||
, const Handler& handler)
|
||||
{
|
||||
#define ALERT_POINTER_TYPE(z, n, text) (BOOST_PP_CAT(T, n)*)0
|
||||
|
||||
detail::handle_alert_dispatch(
|
||||
alert_
|
||||
, handler
|
||||
, typeid(*alert_)
|
||||
, BOOST_PP_ENUM(TORRENT_MAX_ALERT_TYPES, ALERT_POINTER_TYPE, _)
|
||||
);
|
||||
detail::handle_alert_dispatch(alert_, handler, typeid(*alert_)
|
||||
, BOOST_PP_ENUM(TORRENT_MAX_ALERT_TYPES, ALERT_POINTER_TYPE, _));
|
||||
|
||||
#undef ALERT_POINTER_TYPE
|
||||
}
|
||||
|
|
|
@ -280,6 +280,20 @@ namespace libtorrent
|
|||
{ return std::auto_ptr<alert>(new fastresume_rejected_alert(*this)); }
|
||||
};
|
||||
|
||||
struct TORRENT_EXPORT peer_blocked_alert: alert
|
||||
{
|
||||
peer_blocked_alert(address const& ip_
|
||||
, std::string const& msg)
|
||||
: alert(alert::info, msg)
|
||||
, ip(ip_)
|
||||
{}
|
||||
|
||||
address ip;
|
||||
|
||||
virtual std::auto_ptr<alert> clone() const
|
||||
{ return std::auto_ptr<alert>(new peer_blocked_alert(*this)); }
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -597,6 +597,12 @@ namespace libtorrent { namespace detail
|
|||
#if defined(TORRENT_VERBOSE_LOGGING)
|
||||
(*i->second->m_logger) << "*** CONNECTION FILTERED\n";
|
||||
#endif
|
||||
if (m_alerts.should_post(alert::info))
|
||||
{
|
||||
m_alerts.post_alert(peer_blocked_alert(sender.address()
|
||||
, "peer connection closed by IP filter"));
|
||||
}
|
||||
|
||||
session_impl::connection_map::iterator j = i;
|
||||
++i;
|
||||
j->second->disconnect();
|
||||
|
@ -767,7 +773,11 @@ namespace libtorrent { namespace detail
|
|||
#if defined(TORRENT_VERBOSE_LOGGING) || defined(TORRENT_LOGGING)
|
||||
(*m_logger) << "filtered blocked ip\n";
|
||||
#endif
|
||||
// TODO: issue an info-alert when an ip is blocked!!
|
||||
if (m_alerts.should_post(alert::info))
|
||||
{
|
||||
m_alerts.post_alert(peer_blocked_alert(endp.address()
|
||||
, "incoming connection blocked by IP filter"));
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1018,15 +1028,13 @@ namespace libtorrent { namespace detail
|
|||
catch (std::exception& exc)
|
||||
{
|
||||
#ifndef NDEBUG
|
||||
std::string err = exc.what();
|
||||
std::cerr << exc.what() << std::endl;
|
||||
assert(false);
|
||||
#endif
|
||||
}; // msvc 7.1 seems to require this
|
||||
|
||||
void session_impl::connection_completed(
|
||||
boost::intrusive_ptr<peer_connection> const& p)
|
||||
#ifndef NDEBUG
|
||||
try
|
||||
#endif
|
||||
boost::intrusive_ptr<peer_connection> const& p) try
|
||||
{
|
||||
mutex_t::scoped_lock l(m_mutex);
|
||||
|
||||
|
@ -1039,12 +1047,13 @@ namespace libtorrent { namespace detail
|
|||
|
||||
process_connection_queue();
|
||||
}
|
||||
#ifndef NDEBUG
|
||||
catch (std::exception& e)
|
||||
{
|
||||
#ifndef NDEBUG
|
||||
std::cerr << e.what() << std::endl;
|
||||
assert(false);
|
||||
};
|
||||
#endif
|
||||
};
|
||||
|
||||
void session_impl::operator()()
|
||||
{
|
||||
|
|
|
@ -573,6 +573,12 @@ namespace libtorrent
|
|||
#if defined(TORRENT_VERBOSE_LOGGING) || defined(TORRENT_LOGGING)
|
||||
debug_log("blocked ip from tracker: " + i->ip);
|
||||
#endif
|
||||
if (m_ses.m_alerts.should_post(alert::info))
|
||||
{
|
||||
m_ses.m_alerts.post_alert(peer_blocked_alert(a.address()
|
||||
, "peer from tracker blocked by IP filter"));
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -615,6 +621,12 @@ namespace libtorrent
|
|||
#if defined(TORRENT_VERBOSE_LOGGING) || defined(TORRENT_LOGGING)
|
||||
debug_log("blocked ip from tracker: " + host->endpoint().address().to_string());
|
||||
#endif
|
||||
if (m_ses.m_alerts.should_post(alert::info))
|
||||
{
|
||||
m_ses.m_alerts.post_alert(peer_blocked_alert(host->endpoint().address()
|
||||
, "peer from tracker blocked by IP filter"));
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1394,13 +1406,6 @@ namespace libtorrent
|
|||
if (m_ses.is_aborted()) return;
|
||||
|
||||
tcp::endpoint a(host->endpoint());
|
||||
|
||||
if (m_ses.m_ip_filter.access(a.address()) & ip_filter::blocked)
|
||||
{
|
||||
// TODO: post alert: "proxy at " + a.address().to_string() + " (" + hostname + ") blocked by ip filter");
|
||||
return;
|
||||
}
|
||||
|
||||
std::string protocol;
|
||||
std::string hostname;
|
||||
int port;
|
||||
|
@ -1408,6 +1413,16 @@ namespace libtorrent
|
|||
boost::tie(protocol, hostname, port, path)
|
||||
= parse_url_components(url);
|
||||
|
||||
if (m_ses.m_ip_filter.access(a.address()) & ip_filter::blocked)
|
||||
{
|
||||
if (m_ses.m_alerts.should_post(alert::info))
|
||||
{
|
||||
m_ses.m_alerts.post_alert(peer_blocked_alert(a.address()
|
||||
, "proxy (" + hostname + ") blocked by IP filter"));
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
tcp::resolver::query q(hostname, boost::lexical_cast<std::string>(port));
|
||||
m_host_resolver.async_resolve(q, m_ses.m_strand.wrap(
|
||||
bind(&torrent::on_name_lookup, shared_from_this(), _1, _2, url, a)));
|
||||
|
@ -1456,7 +1471,11 @@ namespace libtorrent
|
|||
|
||||
if (m_ses.m_ip_filter.access(a.address()) & ip_filter::blocked)
|
||||
{
|
||||
// TODO: post alert: "web seed at " + a.address().to_string() + " blocked by ip filter");
|
||||
if (m_ses.m_alerts.should_post(alert::info))
|
||||
{
|
||||
m_ses.m_alerts.post_alert(peer_blocked_alert(a.address()
|
||||
, "web seed (" + url + ") blocked by IP filter"));
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1841,7 +1860,14 @@ namespace libtorrent
|
|||
INVARIANT_CHECK;
|
||||
tcp::endpoint const& a(peerinfo->ip);
|
||||
if (m_ses.m_ip_filter.access(a.address()) & ip_filter::blocked)
|
||||
{
|
||||
if (m_ses.m_alerts.should_post(alert::info))
|
||||
{
|
||||
m_ses.m_alerts.post_alert(peer_blocked_alert(a.address()
|
||||
, "peer connection blocked by IP filter"));
|
||||
}
|
||||
throw protocol_error(a.address().to_string() + " blocked by ip filter");
|
||||
}
|
||||
|
||||
if (m_connections.find(a) != m_connections.end())
|
||||
throw protocol_error("already connected to peer");
|
||||
|
|
Loading…
Reference in New Issue