All pastes #995042 Raw Edit

Mine

public text v1 · immutable
#995042 ·published 2008-04-23 20:53 UTC
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;
}