rendered paste body#include "stdafx.h"
#include "tracker_input.h"
#include "bt_misc.h"
#include "socket.h"
#include <boost/algorithm/string.hpp>
using namespace boost;
Ctracker_input::Ctracker_input()
{
m_downloaded = 0;
m_event = e_none;
m_event_invalid = false;
m_field_index = -1;
m_field_index_invalid = false;
m_ipa = 0;
m_left = 0;
m_port = 0;
m_uploaded = 0;
m_uploaded_invalid = false;
m_downloaded_invalid = false;
m_left_invalid = false;
m_info_hash_invalid = false;
m_port_invalid = false;
m_num_want = -1;
m_agent = "---";
m_host = "---";
}
void Ctracker_input::set(const std::string& name, const std::string& value)
{
m_field_index++;
if (name.empty())
return;
switch (name[0])
{
case 'd':
if (name == "downloaded")
{
m_downloaded = atoll(value.c_str());
if (value == "00" || value == "000" || value == "0000" || starts_with(value, "00l"))
m_downloaded_invalid = true;
if (m_field_index != 4)
m_field_index_invalid = true;
}
break;
case 'e':
if (name == "event")
{
if (m_event != e_none)
m_event_invalid = true;
if (value == "completed")
m_event = e_completed;
else if (value == "started")
m_event = e_started;
else if (value == "stopped")
m_event = e_stopped;
else
m_event = e_none;
}
break;
case 'i':
if (name == "info_hash" && value.size() == 20)
{
m_info_hash = value;
m_info_hashes.push_back(value);
if (m_field_index != 0)
m_field_index_invalid = true;
}
if (name == "info_hash" && value.size() != 20)
{
m_info_hash = value;
m_field_index_invalid = true;
m_info_hash_invalid = true;
}
else if (name == "ip")
m_ipa = inet_addr(value.c_str());
break;
case 'l':
if (name == "left")
{
m_left = atoll(value.c_str());
if (value == "00" || value == "000" || value == "0000")
m_left_invalid = true;
if (m_field_index != 5)
m_field_index_invalid = true;
}
break;
case 'n':
if (name == "numwant")
m_num_want = atoi(value.c_str());
break;
case 'p':
if (name == "peer_id" && value.size() == 20)
{
m_peer_id = value;
if (m_field_index != 1)
m_field_index_invalid = true;
}
else if (name == "port")
{
if (m_port != 0)
m_port_invalid = true;
m_port = htons(atoi(value.c_str()));
if (m_field_index != 2)
m_field_index_invalid = true;
}
break;
case 'u':
if (name == "uploaded")
{
m_uploaded = atoll(value.c_str());
if (value == "00" || value == "000" || value == "0000")
m_uploaded_invalid = true;
if (m_field_index != 3)
m_field_index_invalid = true;
}
break;
}
}
bool Ctracker_input::valid() const
{
return m_downloaded >= 0
&& (m_event != e_completed || !m_left)
&& m_info_hash.size() == 20
&& m_left >= -1
&& m_peer_id.size() == 20
&& m_port >= 0
&& m_uploaded >= 0;
}
bool Ctracker_input::banned() const
{
// return false;
if (m_agent[0] == '*')
return true;
if (m_agent[0] == 'T' && starts_with(m_peer_id, "-AZ2504"))
return true;
if (starts_with(m_agent, "BitTorrent/3.4") || starts_with(m_agent,"BitTorrent/4.")
|| starts_with(m_agent,"BitTorrent/brst"))
return true;
if (starts_with(m_agent, "Rufus"))
return true;
if (starts_with(m_agent, "Fast"))
return true;
if (starts_with(m_agent, "Raza") || starts_with(m_agent, "RAZA") )
return true;
if (starts_with(m_agent, "Mozilla"))
return true;
if (starts_with(m_agent, "ABC"))
return true;
if (starts_with(m_peer_id, "M6") && starts_with(m_agent, "BitTorrent/6."))
return true;
if (m_peer_id[7] == '-')
// standard id
switch (m_peer_id[0])
{
case '-':
switch (m_peer_id[1])
{
case 'A': // -AZ* > Azureus
return starts_with(m_peer_id, "-AZ2304")
|| starts_with(m_peer_id, "-AZ2302")
|| starts_with(m_peer_id, "-AZ2300")
|| starts_with(m_peer_id, "-AZ2206")
|| starts_with(m_peer_id, "-AZ2205")
|| starts_with(m_peer_id, "-AZ2204")
|| starts_with(m_peer_id, "-AZ2203")
|| starts_with(m_peer_id, "-AZ2202")
|| starts_with(m_peer_id, "-AZ2500B")
|| starts_with(m_peer_id, "-A3")
|| starts_with(m_peer_id, "A26")
|| starts_with(m_peer_id, "-AZ3");
case 'B': // -BC* > BitComet, -BB* > ?
return starts_with(m_peer_id, "-BB")
|| starts_with(m_peer_id, "-BC0060");
case 'M':
return starts_with(m_peer_id, "Mbrst")
|| starts_with(m_peer_id, "M5");
case 'R':
return starts_with(m_peer_id, "R26");
case 'U': // -UT* > uTorrent
return starts_with(m_peer_id, "-UT171");
//|| starts_with(m_peer_id, "-UT161B");
// starts_with(m_peer_id, "-UT017");
case 'T': // -TS* > TorrentStorm
return starts_with(m_peer_id, "-TS")
|| starts_with(m_peer_id, "-TR0070")
|| starts_with(m_peer_id, "-TR0006")
|| starts_with(m_peer_id, "-TR0005");
default:
return false;
}
//case 'A': // A* > ABC
//case 'M': // M* > Mainline
//case 'S': // S* > Shadow
//case 'T': // T* > BitTornado
//case 'X': // XBT* > XBT
default:
return false;
}
else
switch (m_peer_id[0])
{
case '-':
switch (m_peer_id[1])
{
//case 'G': // -G3* > G3
case 'S': // -SZ* > ?
return starts_with(m_peer_id, "-SZ");
default:
return false;
}
case 'e': // exbc* > BitComet/BitLord
return starts_with(m_peer_id, "exbc0L")
|| starts_with(m_peer_id, "exbcL")
|| starts_with(m_peer_id, "exbcLORD")
|| starts_with(m_peer_id, "exbc\08")
|| starts_with(m_peer_id, "exbc\09")
|| starts_with(m_peer_id, "exbc\0:");
//case 'S': // S57* > Shadow 57
default:
return starts_with(m_peer_id, "BS")
|| starts_with(m_peer_id, "FUTB")
|| starts_with(m_peer_id, "TO038")
|| starts_with(m_peer_id, "R26")
|| starts_with(m_peer_id, "Mbrst")
|| starts_with(m_peer_id, "M5")
|| starts_with(m_peer_id, "A301")
|| starts_with(m_peer_id, "A26")
|| starts_with(m_peer_id, "turbo")
|| starts_with(m_peer_id, "AZ2500B")
|| starts_with(m_peer_id, "A3")
|| starts_with(m_peer_id, "R26");
}
return false;
}