def setUpPostSession(self):
        """ override TestAsServer """
        TestAsServer.setUpPostSession(self)

        self.mypermid = str(self.my_keypair.pub().get_der())
        self.hispermid = str(self.his_keypair.pub().get_der())

        # Create URL compat torrents and save in Torrent database.
        self.tdef1 = TorrentDef.load_from_url(
            P2PURL_SCHEME +
            '://127.2.3.42:7764/announce?SjaakCam.mpegts&k=MHowDQYJKoZIhvcNAQEBBQADaQAwZgJhAN0Khlp5ZhWC7VfLynCkKts71b8h8tZXH87PkDtJUTJaX_SS1Cddxkv63PRmKOvtAHhkTLSsWOZbSeHkOlPIq_FGg2aDLDJ05g3lQ-8mSmo05ff4SLqNUTShWO2CR2TPhQIBAw&l=HCAAAA&s=15&a=RSA&b=AAIAAA'
        )
        self.torrentfn1 = os.path.join(
            self.session.get_torrent_collecting_dir(), "live.torrent")
        self.tdef1.save(self.torrentfn1)

        self.tdef2 = TorrentDef.load_from_url(
            P2PURL_SCHEME +
            '://127.1.0.10:6969/announce?trailer.mkv&r=TTgcifG0Ot7STCY2JL8SUOxROFo&l=AKK35A&s=15&b=AAFnGg'
        )
        self.torrentfn2 = os.path.join(
            self.session.get_torrent_collecting_dir(), "vod.torrent")
        self.tdef2.save(self.torrentfn2)

        self.torrent_db = self.session.open_dbhandler(NTFY_TORRENTS)
        extra_info = {'status': 'good', 'filename': self.torrentfn1}
        self.torrent_db.addExternalTorrent(self.tdef1,
                                           source='',
                                           extra_info=extra_info)
        extra_info = {'status': 'good', 'filename': self.torrentfn2}
        self.torrent_db.addExternalTorrent(self.tdef2,
                                           source='',
                                           extra_info=extra_info)
Ejemplo n.º 2
0
    def test_load_from_url(self):
        # Setup file server to serve torrent file
        self.session_base_dir = mkdtemp(suffix="_tribler_test_load_from_url")
        files_path = os.path.join(self.session_base_dir, 'http_torrent_files')
        os.mkdir(files_path)
        shutil.copyfile(TORRENT_UBUNTU_FILE,
                        os.path.join(files_path, 'ubuntu.torrent'))

        file_server_port = get_random_port()
        self.setUpFileServer(file_server_port, files_path)

        def _on_load(torrent_def):
            torrent_def.metainfo = create_valid_metainfo(
                torrent_def.get_metainfo())
            self.assertTrue(valid_torrent_file(torrent_def.get_metainfo()))
            self.assertEqual(
                torrent_def.get_metainfo(),
                TorrentDef.load(TORRENT_UBUNTU_FILE).get_metainfo())
            self.assertEqual(torrent_def.infohash,
                             TorrentDef.load(TORRENT_UBUNTU_FILE).infohash)

        torrent_url = 'http://localhost:%d/ubuntu.torrent' % file_server_port
        deferred = TorrentDef.load_from_url(torrent_url)
        deferred.addCallback(_on_load)
        return deferred
Ejemplo n.º 3
0
 def startDownloadFromUrl(self,
                          url,
                          destdir=None,
                          cmdline=False,
                          selectedFiles=None,
                          vodmode=False,
                          hops=0):
     try:
         tdef = TorrentDef.load_from_url(url)
         if tdef:
             kwargs = {
                 'tdef': tdef,
                 'cmdline': cmdline,
                 'destdir': destdir,
                 'selectedFiles': selectedFiles,
                 'vodmode': vodmode,
                 'hops': hops
             }
             if wx.Thread_IsMain():
                 self.startDownload(**kwargs)
             else:
                 wx.CallAfter(self.startDownload, *kwargs)
             return True
     except:
         print_exc()
     self.guiUtility.Notify("Download from url failed", icon=wx.ART_WARNING)
     return False
Ejemplo n.º 4
0
    def start_download_from_url(self, url, dconfig=None):

        def _on_loaded(tdef):
            return self.start_download(torrentfilename=None, infohash=None, tdef=tdef, dconfig=dconfig)

        deferred = TorrentDef.load_from_url(url)
        deferred.addCallback(_on_loaded)
        return deferred
Ejemplo n.º 5
0
    def start_download_from_url(self, url, dconfig=None):

        def _on_loaded(tdef):
            return self.start_download(torrentfilename=None, infohash=None, tdef=tdef, dconfig=dconfig)

        deferred = TorrentDef.load_from_url(url)
        deferred.addCallback(_on_loaded)
        return deferred
Ejemplo n.º 6
0
    def setup(self):
        """
        This sets up a Tribler session, loads the managers and the XML-RPC server.
        :return: Nothing.
        """

        _logger.error("Loading XMLRPCServer")
        print "----------------------Loading XMLRPCServer"
        self.xmlrpc = XMLRPCServer(iface="0.0.0.0", port=8000)

        _logger.error("Loading TriblerSessionService")
        print "----------------------Loading TriblerSessionService"
        self.tribler = TriblerSession(self.xmlrpc)
        self.tribler.start_session()

        # Wait for dispersy to initialize
        print "----------------------Waiting for Dispersy to initialize"
        while not self.tribler.is_running():
            time.sleep(0.1)
        print "----------------------Dispersy is initialized!"

        # Disable ChannelManager
        #_logger.error("Loading ChannelManager")
        #self.cm = ChannelManager.getInstance(self.tribler.get_session(), self.xmlrpc)

        _logger.error("Loading TorrentManager")
        print "----------------------Loading TorrentManager"
        self.tm = TorrentManager.getInstance(self.tribler.get_session(),
                                             self.xmlrpc)

        _logger.error("Loading DownloadManager")
        print "----------------------Loading DownloadManager"
        self.dm = DownloadManager.getInstance(self.tribler.get_session(),
                                              self.xmlrpc)

        _logger.error("Loading ConfigurationManager")
        print "----------------------Loading ConfigurationManager"
        # Load this last because it sets settings in other managers
        self.sm = SettingsManager.getInstance(self.tribler.get_session(),
                                              self.xmlrpc)

        _logger.error("Now running XMLRPC on http://%s:%s/tribler" %
                      (self.xmlrpc._iface, self.xmlrpc._port))
        print "----------------------Now running XMLRPC on http://%s:%s/tribler" % (
            self.xmlrpc._iface, self.xmlrpc._port)
        self.xmlrpc.start_server()

        # TODO: test streaming:
        tdef = TorrentDef.load_from_url(URL)
        if tdef is None:
            raise TypeError('Torrent could not be loaded from ' + URL +
                            '. Check if you\'ve got an internet connection.')
        self.info_hash = hexlify(tdef.get_infohash())
        #self.tribler.get_session().set_install_dir(FILES_DIR + u'/lib/python2.7/site-packages')
        self.dm.add_torrent(self.info_hash, tdef.get_name())

        Clock.schedule_interval(lambda dt: self.poller(), 3.0)
Ejemplo n.º 7
0
    def setUpPostSession(self):
        """ override TestAsServer """
        TestAsServer.setUpPostSession(self)

        self.mypermid = str(self.my_keypair.pub().get_der())
        self.hispermid = str(self.his_keypair.pub().get_der())

        # Create URL compat torrents and save in Torrent database.
        self.tdef1 = TorrentDef.load_from_url(P2PURL_SCHEME+'://127.2.3.42:7764/announce?SjaakCam.mpegts&k=MHowDQYJKoZIhvcNAQEBBQADaQAwZgJhAN0Khlp5ZhWC7VfLynCkKts71b8h8tZXH87PkDtJUTJaX_SS1Cddxkv63PRmKOvtAHhkTLSsWOZbSeHkOlPIq_FGg2aDLDJ05g3lQ-8mSmo05ff4SLqNUTShWO2CR2TPhQIBAw&l=HCAAAA&s=15&a=RSA&b=AAIAAA')
        self.torrentfn1 = os.path.join(self.session.get_torrent_collecting_dir(),"live.torrent")
        self.tdef1.save(self.torrentfn1)

        self.tdef2 = TorrentDef.load_from_url(P2PURL_SCHEME+'://127.1.0.10:6969/announce?trailer.mkv&r=TTgcifG0Ot7STCY2JL8SUOxROFo&l=AKK35A&s=15&b=AAFnGg')
        self.torrentfn2 = os.path.join(self.session.get_torrent_collecting_dir(),"vod.torrent")
        self.tdef2.save(self.torrentfn2)

        self.torrent_db = self.session.open_dbhandler(NTFY_TORRENTS)
        extra_info = {'status':'good', 'filename':self.torrentfn1}
        self.torrent_db.addExternalTorrent(self.tdef1, source='',extra_info=extra_info)
        extra_info = {'status':'good', 'filename':self.torrentfn2}
        self.torrent_db.addExternalTorrent(self.tdef2, source='',extra_info=extra_info)
Ejemplo n.º 8
0
    def setup(self):
        """
        This sets up a Tribler session, loads the managers and the XML-RPC server.
        :return: Nothing.
        """

        _logger.error("Loading XMLRPCServer")
        print "----------------------Loading XMLRPCServer"
        self.xmlrpc = XMLRPCServer(iface="0.0.0.0", port=8000)

        _logger.error("Loading TriblerSessionService")
        print "----------------------Loading TriblerSessionService"
        self.tribler = TriblerSession(self.xmlrpc)
        self.tribler.start_session()

        # Wait for dispersy to initialize
        print "----------------------Waiting for Dispersy to initialize"
        while not self.tribler.is_running():
            time.sleep(0.1)
        print "----------------------Dispersy is initialized!"

        # Disable ChannelManager
        #_logger.error("Loading ChannelManager")
        #self.cm = ChannelManager.getInstance(self.tribler.get_session(), self.xmlrpc)

        _logger.error("Loading TorrentManager")
        print "----------------------Loading TorrentManager"
        self.tm = TorrentManager.getInstance(self.tribler.get_session(), self.xmlrpc)

        _logger.error("Loading DownloadManager")
        print "----------------------Loading DownloadManager"
        self.dm = DownloadManager.getInstance(self.tribler.get_session(), self.xmlrpc)

        _logger.error("Loading ConfigurationManager")
        print "----------------------Loading ConfigurationManager"
        # Load this last because it sets settings in other managers
        self.sm = SettingsManager.getInstance(self.tribler.get_session(), self.xmlrpc)

        _logger.error("Now running XMLRPC on http://%s:%s/tribler" % (self.xmlrpc._iface, self.xmlrpc._port))
        print "----------------------Now running XMLRPC on http://%s:%s/tribler" % (self.xmlrpc._iface, self.xmlrpc._port)
        self.xmlrpc.start_server()

        # TODO: test streaming:
        tdef = TorrentDef.load_from_url(URL)
        if tdef is None:
            raise TypeError('Torrent could not be loaded from ' + URL + '. Check if you\'ve got an internet connection.')
        self.info_hash = hexlify(tdef.get_infohash())
        #self.tribler.get_session().set_install_dir(FILES_DIR + u'/lib/python2.7/site-packages')
        self.dm.add_torrent(self.info_hash, tdef.get_name())

        Clock.schedule_interval(lambda dt: self.poller(), 3.0)
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
    else:
        if 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
        
#    if not (isinstance(d['content_name'],str) and isinstance(d['length'],int) and isinstance(d['leecher'],int) and isinstance(d['seeder'],int)):
#        return False
#    if len(d) > 4: # no other keys
#        return False
    return True
Ejemplo n.º 10
0
    def test_load_from_url_404(self):
        # Setup file server to serve torrent file
        self.session_base_dir = mkdtemp(suffix="_tribler_test_load_from_url")
        files_path = os.path.join(self.session_base_dir, 'http_torrent_files')
        os.mkdir(files_path)
        # Do not copy the torrent file to produce 404

        file_server_port = get_random_port()
        self.setUpFileServer(file_server_port, files_path)

        def _on_error(failure):
            failure.trap(HttpError)
            self.assertEqual(failure.value.response.code, 404)

        torrent_url = 'http://localhost:%d/ubuntu.torrent' % file_server_port
        deferred = TorrentDef.load_from_url(torrent_url)
        deferred.addErrback(_on_error)
        return deferred
Ejemplo n.º 11
0
    def _GetDestPath(self, torrentfilename=None, torrenturl=None):
        tdef = None
        if torrentfilename:
            tdef = TorrentDef.load(torrentfilename)
        if torrenturl:
            tdef = TorrentDef.load_from_url(torrenturl)
        dlg = SaveAs(
            self, tdef, self.defaultDLConfig.get_dest_dir(), None,
            os.path.join(self.frame.utility.session.get_state_dir(),
                         'recent_download_history'))
        id = dlg.ShowModal()

        if id == wx.ID_OK:
            destdir = dlg.GetPath()
        else:
            destdir = None
        dlg.Destroy()
        return destdir
Ejemplo n.º 12
0
    def test_load_from_url_404(self):
        # Setup file server to serve torrent file
        self.session_base_dir = mkdtemp(suffix="_tribler_test_load_from_url")
        files_path = os.path.join(self.session_base_dir, 'http_torrent_files')
        os.mkdir(files_path)
        # Do not copy the torrent file to produce 404

        file_server_port = get_random_port()
        self.setUpFileServer(file_server_port, files_path)

        def _on_error(failure):
            failure.trap(HttpError)
            self.assertEqual(failure.value.response.code, 404)

        torrent_url = 'http://localhost:%d/ubuntu.torrent' % file_server_port
        deferred = TorrentDef.load_from_url(torrent_url)
        deferred.addErrback(_on_error)
        return deferred
Ejemplo n.º 13
0
 def _refresh(self):
     channel_url = None
     try:
         self.key_url_lock.acquire()
         channel_url = deepcopy(self.key_url)
     finally:
         self.key_url_lock.release()
     
     if channel_url:
         for key, urls in channel_url.iteritems():
             if key in self.key_callbacks:
                 for url in urls:
                     if DEBUG:
                         print >> sys.stderr, "RssParser: getting rss ", url, len(urls)
                     
                     historyfile = self.gethistfilename(url, key)
                     urls_already_seen = URLHistory(historyfile)
                     urls_already_seen.read()
                     
                     newItems = self.readUrl(url, urls_already_seen)
                     for title, new_urls, description, thumbnail in newItems:
                         for new_url in new_urls:
                             urls_already_seen.add(new_url)
                             urls_already_seen.write()
                             
                             try:
                                 if DEBUG:
                                     print >> sys.stderr, "RssParser: trying ", new_url
                                 
                                 torrent = TorrentDef.load_from_url(new_url)
                                 torrent.save(self.gettorrentfilename(torrent))
                                 
                                 for callback in self.key_callbacks[key]:
                                     try:
                                         callback(key, torrent, extraInfo = {'title':title, 'description': description, 'thumbnail': thumbnail})
                                     except:
                                         print_exc()
                                         
                                 break
                             except:
                                 pass
                             
                             
                             time.sleep(RSS_CHECK_FREQUENCY)
Ejemplo n.º 14
0
 def startDownloadFromUrl(self, url, destdir=None, cmdline=False, selectedFiles=None, vodmode=False, hops=0):
     try:
         tdef = TorrentDef.load_from_url(url)
         if tdef:
             kwargs = {'tdef': tdef,
                       'cmdline': cmdline,
                       'destdir': destdir,
                       'selectedFiles': selectedFiles,
                       'vodmode': vodmode,
                       'hops': hops}
             if wx.Thread_IsMain():
                 self.startDownload(**kwargs)
             else:
                 wx.CallAfter(self.startDownload, *kwargs)
             return True
     except:
         print_exc()
     self.guiUtility.Notify("Download from url failed", icon=wx.ART_WARNING)
     return False
Ejemplo n.º 15
0
    def test_load_from_url(self):
        # Setup file server to serve torrent file
        self.session_base_dir = mkdtemp(suffix="_tribler_test_load_from_url")
        files_path = os.path.join(self.session_base_dir, 'http_torrent_files')
        os.mkdir(files_path)
        shutil.copyfile(TORRENT_UBUNTU_FILE, os.path.join(files_path, 'ubuntu.torrent'))

        file_server_port = get_random_port()
        self.setUpFileServer(file_server_port, files_path)

        def _on_load(torrent_def):
            torrent_def.metainfo = create_valid_metainfo(torrent_def.get_metainfo())
            self.assertTrue(valid_torrent_file(torrent_def.get_metainfo()))
            self.assertEqual(torrent_def.get_metainfo(), TorrentDef.load(TORRENT_UBUNTU_FILE).get_metainfo())
            self.assertEqual(torrent_def.infohash, TorrentDef.load(TORRENT_UBUNTU_FILE).infohash)

        torrent_url = 'http://localhost:%d/ubuntu.torrent' % file_server_port
        deferred = TorrentDef.load_from_url(torrent_url)
        deferred.addCallback(_on_load)
        return deferred
Ejemplo n.º 16
0
    def _GetDestPath(self, torrentfilename=None, torrenturl=None):
        tdef = None
        if torrentfilename:
            tdef = TorrentDef.load(torrentfilename)
        if torrenturl:
            tdef = TorrentDef.load_from_url(torrenturl)
        dlg = SaveAs(
            self,
            tdef,
            self.defaultDLConfig.get_dest_dir(),
            None,
            os.path.join(self.frame.utility.session.get_state_dir(), "recent_download_history"),
        )
        id = dlg.ShowModal()

        if id == wx.ID_OK:
            destdir = dlg.GetPath()
        else:
            destdir = None
        dlg.Destroy()
        return destdir
Ejemplo n.º 17
0
    def got_metadata(self, permid, message, selversion):
        """ receive torrent file from others """

        # Arno, 2007-06-20: Disabled the following code. What's this? Somebody sends
        # us something and we refuse? Also doesn't take into account download help
        #and remote-query extension.

        #if self.upload_rate <= 0:    # if no upload, no download, that's the game
        #    return True    # don't close connection

        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):
                # 19/02/10 Boudewijn: isValidInfohash either returns
                # True or raises a ValueError. So this part of the
                # code will never be reached...
                return False

            assert isinstance(
                infohash,
                str), "INFOHASH has invalid type: %s" % type(infohash)
            assert len(
                infohash
            ) == INFOHASH_LENGTH, "INFOHASH has invalid length: %d" % len(
                infohash)

            #print >>sys.stderr,"metadata: got_metadata: hexinfohash: get_collected_torrent_filename(infohash)

            if not infohash in self.requested_torrents:  # got a torrent which was not requested
                return True
            if self.torrent_db.hasMetaData(infohash):
                return True

            # P2PURL
            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'])
                        # Internal storage format is still .torrent file
                        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, 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 DEBUG:
            #    print >>sys.stderr,"metadata: Was I asked to relay for someone", self.proxy_message_handler

            if filename is not None:
                self.notify_torrent_is_in(infohash, metadata, filename)

            # BarterCast: add bytes of torrent to BarterCastDB
            # Save exchanged KBs in BarterCastDB
            if permid is not None and BARTERCAST_TORRENTS:
                self.overlay_bridge.add_task(
                    lambda: self.olthread_bartercast_torrentexchange(
                        permid, 'downloaded'), 0)
Ejemplo n.º 18
0
    def got_metadata(self, permid, message, selversion):    
        """ receive torrent file from others """
        
        # Arno, 2007-06-20: Disabled the following code. What's this? Somebody sends 
        # us something and we refuse? Also doesn't take into account download help 
        #and remote-query extension.
        
        #if self.upload_rate <= 0:    # if no upload, no download, that's the game
        #    return True    # don't close connection
        
        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 not infohash in self.requested_torrents:    # got a torrent which was not requested
                return True
            if self.torrent_db.hasMetaData(infohash):
                return True

            # P2PURL
            goturl = False
            if selversion >= OLPROTO_VER_ELEVENTH:
                if 'metatype' in message and message['metatype'] == URL_MIME_TYPE:
                    try:
                        tdef = TorrentDef.load_from_url(metadata['metadata'])
                        # Internal storage format is still .torrent file
                        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,time.asctime(),'-', "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, msg:
                    print_exc()
                    print >> sys.stderr, time.asctime(),'-', "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 DEBUG:
            #    print >>sys.stderr,time.asctime(),'-', "metadata: Was I asked to dlhelp someone",self.dlhelper

            if filename is not None:
                self.notify_torrent_is_in(infohash,metadata,filename)
            
            
            # BarterCast: add bytes of torrent to BarterCastDB
            # Save exchanged KBs in BarterCastDB
            if permid is not None and BARTERCAST_TORRENTS:
                self.overlay_bridge.add_task(lambda:self.olthread_bartercast_torrentexchange(permid, 'downloaded'), 0)
Ejemplo n.º 19
0
    def got_metadata(self, permid, message, selversion):
        """ receive torrent file from others """

        # Arno, 2007-06-20: Disabled the following code. What's this? Somebody sends
        # us something and we refuse? Also doesn't take into account download help
        # and remote-query extension.

        # if self.upload_rate <= 0:    # if no upload, no download, that's the game
        #    return True    # don't close connection

        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):
                # 19/02/10 Boudewijn: isValidInfohash either returns
                # True or raises a ValueError. So this part of the
                # code will never be reached...
                return False

            assert isinstance(infohash, str), "INFOHASH has invalid type: %s" % type(infohash)
            assert len(infohash) == INFOHASH_LENGTH, "INFOHASH has invalid length: %d" % len(infohash)

            # print >>sys.stderr,"metadata: got_metadata: hexinfohash: get_collected_torrent_filename(infohash)

            if not infohash in self.requested_torrents:  # got a torrent which was not requested
                return True
            if self.torrent_db.hasMetaData(infohash):
                return True

            # P2PURL
            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"])
                        # Internal storage format is still .torrent file
                        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, 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 DEBUG:
            #    print >>sys.stderr,"metadata: Was I asked to relay for someone", self.proxy_message_handler

            if filename is not None:
                self.notify_torrent_is_in(infohash, metadata, filename)

            # BarterCast: add bytes of torrent to BarterCastDB
            # Save exchanged KBs in BarterCastDB
            if permid is not None and BARTERCAST_TORRENTS:
                self.overlay_bridge.add_task(lambda: self.olthread_bartercast_torrentexchange(permid, "downloaded"), 0)
Ejemplo n.º 20
0
    def recv_query_reply(self,permid,message,selversion):
        
        #print "****** recv query reply", len(message)
        
        if selversion < OLPROTO_VER_SIXTH:
            return False
        
        #if len(message) > MAX_QUERY_REPLY_LEN:
        #    return True    # don't close

        # Unpack
        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

        
        # Check auth
        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 not 'metatype' in torrentrec:
                        if DEBUG:
                            print >>sys.stderr,"rquery: QUERY_REPLY has no metatype field", selversion
                        return False

                    if not 'metadata' 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:
                        # Validity test
                        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
                        

        # Process
        self.process_query_reply(permid,queryrec['query'],queryrec['usercallback'],d)
        return True