diff options
Diffstat (limited to 'test/test_ClientIdentifier.py')
-rw-r--r-- | test/test_ClientIdentifier.py | 193 |
1 files changed, 193 insertions, 0 deletions
diff --git a/test/test_ClientIdentifier.py b/test/test_ClientIdentifier.py new file mode 100644 index 0000000..220fe7e --- /dev/null +++ b/test/test_ClientIdentifier.py @@ -0,0 +1,193 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. +# +# Written by Matt Chisholm + +## To use: +## +## * modify btdownloadgui.py or some other client to pass a an open (log) +## file object as the second argument to the +## ClientIdentifier.identify_client() +## method. It will log all unknown clients. +## +## * run test/test_ClientIdentifier.py with the log file(s) as it's +## argument(s). It will report any newly identifiable clients in the log + +import sys +sys.path = ['.',] + sys.path #HACK + +from BitTorrent import ClientIdentifier + +print "Using:", ClientIdentifier + +def test(peerid): + client, version = ClientIdentifier.identify_client(peerid) + try: + try: + out = peerid.encode('utf8') + except: + out = peerid.encode('ascii') + except: + out = repr(peerid) + + if client != 'unknown': + print 'identified %s %s\t(from %s)' % (client.encode('utf8'), + version, out) + else: + print 'failed:\t\t\t\t', out + + +lognames = ['unknown_clients.log'] +if len(sys.argv) > 1: + lognames = sys.argv[1:] + + +for logname in lognames: + log = open(logname, 'r') + + line = log.readline() + next = True + + seenids = {} + + while line and next: + #print 'l:', line + #print 'n:', next + + if line[0:4] == '----': + line = log.readline() + continue + + peerid = '' + + next = log.readline() + while next[0:4] != '----': + peerid += line + line = next + next = log.readline() + + peerid += line[:-1] + + if not seenids.has_key(peerid): + + seenids[peerid] = True + test(peerid) + + line = next + +def run_tests(): + print 'running tests' + for client, version, peerid in ( + # 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + ('BitTorrent', '3.4.2', + '\x4D\x33\x2D\x34\x2D\x32\x2D\x2D\x34\x50\x77\x19\x9F\xAE\xC4\xA6\x73\xBE\xCA\x01'), + ('BitTorrent (obsolete)', '', + '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4C\x53\x44\x19\x33\x10\x42\x77'), + ('Shareaza', '', + '\x8A\x92\x36\xB1\x67\x33\x5B\xDA\xAF\xCC\x85\x34\x5D\x59\x49\xAA\x20\xDB\x6F\xEC'), + ('Shareaza', '', + '\x95\xAD\x85\x2D\x0A\x2C\x6B\xFD\x3C\x97\xEB\x23\x15\xE5\x68\x59\xCC\xC5\x60\x38'), + ('Shareaza', '2.1.3.2', + '\x2D\x53\x5A\x32\x31\x33\x32\x2D\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'), + ('ABC', '2.6.9', + '\x41\x32\x36\x39\x2D\x2D\x2D\x2D\x34\x50\x77\x19\x9F\xAE\xC4\xA6\x73\xBE\xCA\x01'), + ('BitComet', '0.56', + '\x65\x78\x62\x63\x00\x38\x7A\x44\x63\x10\x2D\x6E\x9A\xD6\x72\x3B\x33\x9F\x35\xA9'), + ('Azureus', '2.2.0.0', + '\x2D\x41\x5A\x32\x32\x30\x30\x2D\x36\x77\x66\x47\x32\x77\x6B\x36\x77\x57\x4C\x63'), + ('burst!', '1.1.3', + '\x4D\x62\x72\x73\x74\x31\x2D\x31\x2D\x33\x61\x32\x30\x34\x38\x39\x33\x30\x33\x31'), + ("Shadow's", '5.8.11', + '\x53\x35\x38\x42\x2D\x2D\x2D\x2D\x2D\x7A\x78\x70\x70\x52\x4C\x4E\x48\x42\x6F\x35'), + ('Experimental 3.2.1b2', '', + '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x61\xD2\x31\x4F\x4C\x62\xBA'), + ('XanTorrent', '', + '\x44\x61\x6E\x73\x43\x6C\x69\x65\x6E\x74\x20\x26\x4E\x2A\x12\x0B\xFB\xD1\xC4\x72'), + ('XBT', '0.3.6', + '\x58\x42\x54\x30\x33\x36\x2D\x2D\x61\x31\x6A\x71\x63\x71\x66\x53\x36\x44\x35\x66'), + ('BitMagnet', '0.3.1', + '\x00\x1f\x42\x4d\x64\x30\x63\x35\x34\x76\x34\x67\x33\x34\xf4\x3d\x98\x23\x06\x62'), + ('eXeem beta', '0.10.0.0', + '\x2D\x65\x58\x30\x41\x30\x30\x2D\x79\x4C\x72\x6A\x31\x6B\x48\x6A\x4C\x45\x33\x62'), + ('eXeem beta', '0.12.0.0', + '\x2D\x65\x58\x30\x43\x30\x30\x2D\x59\x4C\x29\x7A\x4E\x5A\x33\x7A\x30\x6E\x27\x73'), + ('eXeem beta', '0.13.0.0', + '\x2D\x65\x58\x30\x44\x30\x30\x2D\x67\x70\x21\x2E\x59\x52\x39\x50\x29\x45\x67\x45'), + ('eXeem beta', '0.14.0.0', + '\x2D\x65\x58\x30\x45\x30\x30\x2D\x6A\x49\x56\x45\x43\x6E\x76\x42\x68\x59\x51\x56'), + ('BitBuddy', '0.9.6.1', + '\x2D\x42\x42\x30\x39\x36\x31\x2D\x54\x42\x37\x6A\x4A\x5F\x67\x2D\x6F\x55\x47\x66'), + ('TorrenTres 0.0.2', '', + '\x58\x54\x4F\x52\x52\x33\x30\x32\x2D\xC8\xB2\x84\xCC\x6C\x0F\xD0\xFE\xCD\x46\x5B'), + ('TorrentTopia 1.70', '', + '\x33\x34\x36\x2D\x2D\x2D\x2D\x2D\x2D\x6E\x2E\x4B\x7A\x65\x46\x50\x30\x6E\x56\x68'), + ('TurboBT', '5.0', + '\x74\x75\x72\x62\x6F\x62\x74\x35\x2E\x30\x2E\x30\xD1\xA5\x27\xD4\x52\x0D\x7E\x3E'), + ('BitSpirit', 'HTTPBT', #2.6.3, 2.7.3 + '\x00\x00\x00\x00\x00\x00\x00\x00\x70\x98\x28\xCC\x22\xB7\x48\x54\x54\x50\x42\x54'), + ('BitSpirit', 'UDP0', + '\x00\x1F\x42\x4D\x41\x6E\x6F\x6E\x2E\x27\xC2\x67\x9C\xC3\xA9\xF8\x55\x44\x50\x30'), + ('BitSpirit v2', 'HTTPBT', + '\x00\x02\x42\x53\x9B\x7E\xD3\xE0\x58\xA8\x38\x4A\xA7\x48\x48\x54\x54\x50\x42\x54'), + ('BitSpirit v2', '', + '\x00\x02\x42\x53\x07\x2A\xDB\x18\x34\x50\x77\x19\x9F\xAE\xC4\xA6\x73\xBE\xCA\x01'), + ('Deadman', '', + '\x44\x65\x61\x64\x6D\x61\x6E\x20\x57\x61\x6C\x6B\x69\x6E\x67\x2D\x36\x35\x5A\x56'), + ('BTGetit', '0.7.0.8', + '\x42\x47\x30\x37\x30\x38\x58\x01\xE8\xCA\x76\x5B\xA7\x8C\x7D\x0B\xBE\xCB\x3D\xB2'), + ('eXeem', '', # 2.1 + '\x65\x58\x64\x30\x63\x35\x34\x76\x34\x67\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00'), + ('Bits on Wheels', '0.3', + '\x2D\x42\x4F\x57\x50\x30\x33\x2D\x30\x30\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36'), + ('BitLord', '0.56', + '\x65\x78\x62\x63\x00\x38\x4C\x4F\x52\x44\x32\x00\x04\x8E\xCE\xD5\x7B\xD7\x10\x28'), + ('BitComet', '0.56', + '\x65\x78\x62\x63\x00\x38\x2A\x8A\x6B\x37\x6D\x84\xBD\xCF\x82\x8C\x25\x9B\x07\x04'), + ('CTorrent', '1.3.0.4', + '\x2D\x43\x54\x31\x33\x30\x34\x2D\x9C\x74\x41\xCE\xD7\x3E\x6E\x98\x41\x1F\x67\xD7'), + ('BitVampire 1.3.1', '', # (spoofs BitComet 0.54 with extra '---'),', + '\x65\x78\x62\x63\x00\x36\x2D\x2D\x2D\x55\x21\xE5\xF0\x3A\x78\xC3\x3F\x54\x21\xF1'), + ('Plus! II', 'RC 10', + '\x50\x6C\x75\x73\x31\x32\x52\x31\x30\x2D\x66\x4E\x36\x6E\x69\x32\x41\x7A\x4F\x4B'), + ('GreedBT 2.7.0', '', + '\x32\x37\x30\x2D\x2D\x2D\x2D\x2D\x2D\x68\x34\x69\x66\x4B\x7A\x4B\x6E\x4A\x4F\x50'), + ('BitTornado', '0.3.10', + '\x54\x30\x33\x41\x2D\x2D\x2D\x2D\x2D\x63\x51\x37\x4B\x58\x48\x42\x4E\x73\x32\x64'), + ('BitComet', '0.57', + '\x65\x78\x62\x63\x00\x39\x2A\x8A\x6B\x37\x6D\x84\xBD\xCF\x82\x8C\x25\x9B\x07\x04'), + ('ZipTorrent', '1.2.1.0', + '\x2D\x5A\x54\x31\x32\x31\x30\x2D\x6C\x61\x42\x7A\x46\x38\x37\x35\x38\x54\x61\x79'), + ('Azureus 2.0.3.2', '', + '\x2D\x2D\x2D\x2D\x2D\x41\x7A\x75\x72\x65\x75\x73\x54\x69\x4E\x7A\x2A\x64\x54\xA7'), + ('Rufus', '0.6.5', + '\x00\x41\x52\x53\x64\x30\x63\x35\x34\x76\x34\x67\x33\xf0\x9a\x46\xca\xa0\x65\x95'), + ('Rufus Anonymous', '0.6.5', + '\x00\x41\x52\x53\x41\x6e\x6f\x6e\x79\x6d\x6f\x75\x73\x6d\x72\x25\x16\x95\x03\x33'), + ('PO (unknown)', '0.0.0.1', + '\x2D\x50\x4F\x30\x30\x30\x31\x2D\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'), + ('UR (unknown)', '0.1.1.2', + '\x2D\x55\x52\x30\x31\x31\x32\x2D\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'), + ('Opera', '7685', + 'OP7685f2c1495b1680bf'), + ('KTorrent', '1.1 RC 1', + '-KT11R1-693649213030'), + ): + id_client, id_version = ClientIdentifier.identify_client(peerid) + show = False + if id_client != client: + show = True + print client, 'misidentified as', id_client, '\t', + if id_version != version: + show = True + print version, 'misidentified as', id_version, + if show: + print + print ' based on', peerid +run_tests() |