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"]
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)
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')