#include "stdafx.h" #include "tracker_input.h" #include "bt_misc.h" #include "socket.h" #include 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; }