def isValidRemoteVal(d, selversion): if not isinstance(d, dict): if DEBUG: print >> sys.stderr, 'rqmh: reply: a: value not dict' return False if selversion >= OLPROTO_VER_TWELFTH: if not ('content_name' in d and 'length' in d and 'leecher' in d and 'seeder' in d and 'category' in d and 'torrent_size' in d and 'channel_permid' in d and 'channel_name' in d): if DEBUG: print >> sys.stderr, 'rqmh: reply: torrentrec12: key missing, got', d.keys( ) return False if 'metatype' in d and 'metadata' in d: try: metatype = d['metatype'] metadata = d['metadata'] if metatype == URL_MIME_TYPE: tdef = TorrentDef.load_from_url(metadata) else: metainfo = bdecode(metadata) tdef = TorrentDef.load_from_dict(metainfo) except: if DEBUG: print >> sys.stderr, 'rqmh: reply: torrentrec12: metadata invalid' print_exc() return False elif selversion >= OLPROTO_VER_ELEVENTH: if not ('content_name' in d and 'length' in d and 'leecher' in d and 'seeder' in d and 'category' in d and 'torrent_size' in d and 'channel_permid' in d and 'channel_name' in d): if DEBUG: print >> sys.stderr, 'rqmh: reply: torrentrec11: key missing, got', d.keys( ) return False elif selversion >= OLPROTO_VER_NINETH: if not ('content_name' in d and 'length' in d and 'leecher' in d and 'seeder' in d and 'category' in d and 'torrent_size' in d): if DEBUG: print >> sys.stderr, 'rqmh: reply: torrentrec9: key missing, got', d.keys( ) return False elif not ('content_name' in d and 'length' in d and 'leecher' in d and 'seeder' in d and 'category' in d): if DEBUG: print >> sys.stderr, 'rqmh: reply: torrentrec6: key missing, got', d.keys( ) return False return True
def recv_query_reply(self, permid, message, selversion): if selversion < OLPROTO_VER_SIXTH: return False try: d = bdecode(message[1:]) except: if DEBUG: print >> sys.stderr, 'rquery: Cannot bdecode QUERY_REPLY message', selversion return False if not isValidQueryReply(d, selversion): if DEBUG: print >> sys.stderr, 'rquery: not valid QUERY_REPLY message', selversion return False queryrec = self.is_registered_query_id(d['id']) if not queryrec: if DEBUG: print >> sys.stderr, 'rquery: QUERY_REPLY has unknown query ID', selversion return False if selversion >= OLPROTO_VER_TWELFTH: if queryrec['query'].startswith('SIMPLE+METADATA'): for infohash, torrentrec in d['a'].iteritems(): if 'metatype' not in torrentrec: if DEBUG: print >> sys.stderr, 'rquery: QUERY_REPLY has no metatype field', selversion return False if 'metadata' not in torrentrec: if DEBUG: print >> sys.stderr, 'rquery: QUERY_REPLY has no metadata field', selversion return False if torrentrec['torrent_size'] != len( torrentrec['metadata']): if DEBUG: print >> sys.stderr, 'rquery: QUERY_REPLY torrent_size != len metadata', selversion return False try: if torrentrec['metatype'] == URL_MIME_TYPE: tdef = TorrentDef.load_from_url( torrentrec['metadata']) else: metainfo = bdecode(torrentrec['metadata']) tdef = TorrentDef.load_from_dict(metainfo) except: if DEBUG: print_exc() return False self.process_query_reply(permid, queryrec['query'], queryrec['usercallback'], d) return True
def recv_query_reply(self, permid, message, selversion): if selversion < OLPROTO_VER_SIXTH: return False try: d = bdecode(message[1:]) except: if DEBUG: print >> sys.stderr, 'rquery: Cannot bdecode QUERY_REPLY message', selversion return False if not isValidQueryReply(d, selversion): if DEBUG: print >> sys.stderr, 'rquery: not valid QUERY_REPLY message', selversion return False queryrec = self.is_registered_query_id(d['id']) if not queryrec: if DEBUG: print >> sys.stderr, 'rquery: QUERY_REPLY has unknown query ID', selversion return False if selversion >= OLPROTO_VER_TWELFTH: if queryrec['query'].startswith('SIMPLE+METADATA'): for infohash, torrentrec in d['a'].iteritems(): if 'metatype' not in torrentrec: if DEBUG: print >> sys.stderr, 'rquery: QUERY_REPLY has no metatype field', selversion return False if 'metadata' not in torrentrec: if DEBUG: print >> sys.stderr, 'rquery: QUERY_REPLY has no metadata field', selversion return False if torrentrec['torrent_size'] != len(torrentrec['metadata']): if DEBUG: print >> sys.stderr, 'rquery: QUERY_REPLY torrent_size != len metadata', selversion return False try: if torrentrec['metatype'] == URL_MIME_TYPE: tdef = TorrentDef.load_from_url(torrentrec['metadata']) else: metainfo = bdecode(torrentrec['metadata']) tdef = TorrentDef.load_from_dict(metainfo) except: if DEBUG: print_exc() return False self.process_query_reply(permid, queryrec['query'], queryrec['usercallback'], d) return True
def isValidRemoteVal(d, selversion): if not isinstance(d, dict): if DEBUG: print >> sys.stderr, 'rqmh: reply: a: value not dict' return False if selversion >= OLPROTO_VER_TWELFTH: if not ('content_name' in d and 'length' in d and 'leecher' in d and 'seeder' in d and 'category' in d and 'torrent_size' in d and 'channel_permid' in d and 'channel_name' in d): if DEBUG: print >> sys.stderr, 'rqmh: reply: torrentrec12: key missing, got', d.keys() return False if 'metatype' in d and 'metadata' in d: try: metatype = d['metatype'] metadata = d['metadata'] if metatype == URL_MIME_TYPE: tdef = TorrentDef.load_from_url(metadata) else: metainfo = bdecode(metadata) tdef = TorrentDef.load_from_dict(metainfo) except: if DEBUG: print >> sys.stderr, 'rqmh: reply: torrentrec12: metadata invalid' print_exc() return False elif selversion >= OLPROTO_VER_ELEVENTH: if not ('content_name' in d and 'length' in d and 'leecher' in d and 'seeder' in d and 'category' in d and 'torrent_size' in d and 'channel_permid' in d and 'channel_name' in d): if DEBUG: print >> sys.stderr, 'rqmh: reply: torrentrec11: key missing, got', d.keys() return False elif selversion >= OLPROTO_VER_NINETH: if not ('content_name' in d and 'length' in d and 'leecher' in d and 'seeder' in d and 'category' in d and 'torrent_size' in d): if DEBUG: print >> sys.stderr, 'rqmh: reply: torrentrec9: key missing, got', d.keys() return False elif not ('content_name' in d and 'length' in d and 'leecher' in d and 'seeder' in d and 'category' in d): if DEBUG: print >> sys.stderr, 'rqmh: reply: torrentrec6: key missing, got', d.keys() return False return True
def got_metadata(self, permid, message, selversion): try: message = bdecode(message[1:]) except: print_exc() return False if not isinstance(message, dict): return False try: infohash = message['torrent_hash'] if not isValidInfohash(infohash): return False if infohash not in self.requested_torrents: return True if self.torrent_db.hasMetaData(infohash): return True goturl = False if selversion >= OLPROTO_VER_ELEVENTH: if 'metatype' in message and message['metatype'] == URL_MIME_TYPE: try: tdef = TorrentDef.load_from_url(message['metadata']) metainfo = tdef.get_metainfo() metadata = bencode(metainfo) goturl = True except: print_exc() return False else: metadata = message['metadata'] else: metadata = message['metadata'] if not self.valid_metadata(infohash, metadata): return False if DEBUG: torrent_size = len(metadata) if goturl: mdt = 'URL' else: mdt = 'torrent' print >> sys.stderr, 'metadata: Recvd', mdt, `infohash`, sha(infohash).hexdigest(), torrent_size extra_info = {} if selversion >= OLPROTO_VER_FOURTH: try: extra_info = {'leecher': message.get('leecher', -1), 'seeder': message.get('seeder', -1), 'last_check_time': message.get('last_check_time', -1), 'status': message.get('status', 'unknown')} except Exception as msg: print_exc() print >> sys.stderr, 'metadata: wrong extra info in msg - ', message extra_info = {} filename = self.save_torrent(infohash, metadata, extra_info=extra_info) self.requested_torrents.remove(infohash) if filename is not None: self.notify_torrent_is_in(infohash, metadata, filename) if permid is not None and BARTERCAST_TORRENTS: self.overlay_bridge.add_task(lambda : self.olthread_bartercast_torrentexchange(permid, 'downloaded'), 0) except Exception as e: print_exc() print >> sys.stderr, 'metadata: Received metadata is broken', e, message.keys() return False return True
def got_metadata(self, permid, message, selversion): try: message = bdecode(message[1:]) except: print_exc() return False if not isinstance(message, dict): return False try: infohash = message['torrent_hash'] if not isValidInfohash(infohash): return False if infohash not in self.requested_torrents: return True if self.torrent_db.hasMetaData(infohash): return True goturl = False if selversion >= OLPROTO_VER_ELEVENTH: if 'metatype' in message and message[ 'metatype'] == URL_MIME_TYPE: try: tdef = TorrentDef.load_from_url(message['metadata']) metainfo = tdef.get_metainfo() metadata = bencode(metainfo) goturl = True except: print_exc() return False else: metadata = message['metadata'] else: metadata = message['metadata'] if not self.valid_metadata(infohash, metadata): return False if DEBUG: torrent_size = len(metadata) if goturl: mdt = 'URL' else: mdt = 'torrent' print >> sys.stderr, 'metadata: Recvd', mdt, ` infohash `, sha( infohash).hexdigest(), torrent_size extra_info = {} if selversion >= OLPROTO_VER_FOURTH: try: extra_info = { 'leecher': message.get('leecher', -1), 'seeder': message.get('seeder', -1), 'last_check_time': message.get('last_check_time', -1), 'status': message.get('status', 'unknown') } except Exception as msg: print_exc() print >> sys.stderr, 'metadata: wrong extra info in msg - ', message extra_info = {} filename = self.save_torrent(infohash, metadata, extra_info=extra_info) self.requested_torrents.remove(infohash) if filename is not None: self.notify_torrent_is_in(infohash, metadata, filename) if permid is not None and BARTERCAST_TORRENTS: self.overlay_bridge.add_task( lambda: self.olthread_bartercast_torrentexchange( permid, 'downloaded'), 0) except Exception as e: print_exc() print >> sys.stderr, 'metadata: Received metadata is broken', e, message.keys( ) return False return True