Exemple #1
0
    def share(self, path):
        #create the .torrent

        print(f"sharing {path}")

        #real app
        self.check_tracker()
        TRACKER_URL = self.get_tracker_url()

        _metainfo = metainfo.create_metainfo(path, TRACKER_URL)
        _metainfo_encoded = torrent_parser.encode(_metainfo)

        infohash = hashlib.sha1(torrent_parser.encode(
            _metainfo["info"])).hexdigest()

        #update the files_shared.json
        self.peer.files_shared_lock.acquire()
        self.peer.files[infohash] = {
            "bitfield": [
                True for _ in range(_metainfo["info"]["length"] //
                                    _metainfo["info"]["piece_length"] + 1)
            ],
            "piece_length":
            _metainfo["info"]["piece_length"],
            "path":
            path
        }

        with open(f"files_shared.json", 'w') as f:
            json.dump(self.peer.files, f)

        self.peer.files_shared_lock.release()

        #connect to the tracker
        #real app
        TRACKER_IP, TRACKER_PORT = self.check_tracker()
        connection = http.client.HTTPConnection(TRACKER_IP, TRACKER_PORT)

        #upload the .torrent
        headers = {"Content-type": "text/plain"}
        connection.request("POST",
                           f"/metainfo/{self.id}/{self.ip}/{self.port}",
                           _metainfo_encoded, headers)
        connection.getresponse()

        connection.request(
            "PUT",
            urllib.parse.quote(
                f"/have/{self.id}/{self.ip}/{self.port}/complete/{_metainfo['info']['name']}/{infohash}"
            ))

        print(f"shared: {_metainfo['info']['name']}")

        return _metainfo["info"]["name"], _metainfo["info"]["length"]
Exemple #2
0
    def spoof_torrent(self, id):

        data = self.get_torrent(id)

        if self.tracker_url is None:
            from . import tracker
            self.tracker_url = tracker.exchange_url(data["announce"])

        data["announce"] = self.tracker_url

        return torrent_parser.encode(data)
Exemple #3
0
def get_infohash(metainfo):
    return hashlib.sha1(torrent_parser.encode(metainfo["info"])).hexdigest()
 def test_raw_bytes_encode(self):
     res = {'hash': b'\xAA\xBB\xCC\xDD'}
     data = encode(res)
     self.assertEqual(data, b'd4:hash4:\xAA\xBB\xCC\xDDe')
 def test_encode(self):
     self.assertEqual(encode(12345), b'i12345e')