def packPeers(self, peers): """ All known peers are packed according to the pattern for sharing peers. |n| [n x | IP | Port |] 1B n x 6B """ n = bs.int2byte(len(peers)) return n + b''.join(map(lambda x: socket.inet_aton(x[0]) + struct.pack("!H", x[1]), peers))
def searchRequest0(self, hashfilename, username): n = bs.int2byte(len(username)) try: username = username.encode() except AttributeError: pass payload = b''.join((hashfilename, n, username)) toRemove = [] for i in self.peers: try: connection = self.connectToServer(i) except ConnectionRefusedError: toRemove.append(i) continue try: self.send(connection, 7, payload) reply = self.receive(connection) self.handleAccordingly(connection, reply, 8) finally: connection.close() for i in toRemove: self.removePeer(i)
def createFragments(file_, amount, directory="cache/upload", prime=2 ** 261 - 261, chunksize=128, version=0, **meta): """ Creates Fragments and returns a list of storage location meta: ----- filename - SHA256 of filename uploader - Username of uploader private """ assert amount >= 4 makeDir(directory) files = [] header = b"#CL" + bs.int2byte(version) bytesToAdd = calcBytesToAdd(file_) if "filename" not in meta: filename = os.path.split(file_)[-1].encode() meta["filename"] = hashlib.sha256(filename).hexdigest() meta["added_bytes"] = bytesToAdd meta["hash"] = checksumSha256(file_) polynomes = createPolynomials(file_, bytesToAdd) xValues = random.sample(range(1, 1000000000000000000), amount) for x in xValues: currentMeta = meta.copy() currentMeta["x"] = x currentMeta = json.dumps(currentMeta).encode() currentMeta = b''.join((bs.int2bytes(len(currentMeta), 4), currentMeta)) pieces = b'' for i in range(len(polynomes)): pieces += bs.int2bytes(polynomes[i](x, prime), 33) tempFragmentName = "{}/{}".format(directory, meta["filename"][:14] + str(x)) files.append(tempFragmentName) with open(tempFragmentName, 'wb') as f: f.write(b''.join((header, currentMeta, pieces))) return files
def requestFragment0(self, peer, filehash, username): """ shaFilename and username have to be a byte-object (Py3) [str in py2] Returns True if successful """ n = bs.int2byte(len(username)) payload = b''.join((filehash, n, username)) try: connection = self.connectToServer(peer) except ConnectionRefusedError: self.removePeer(peer) self.logger.info("Could not request fragment") return False try: self.send(connection, 5, payload) reply = self.receive(connection) self.logger.debug("Requested fragment: {}".format(reply)) return self.handleAccordingly(connection, reply, 6) except FileNotFoundError: return False finally: connection.close()
def _pad(self, s): return s + (self.blockSize - len(s) % self.blockSize) \ * bs.int2byte(self.blockSize - len(s) % self.blockSize)
def packMessage(self, version, messageId, payload=b''): message = b''.join((b'CL', bs.int2byte(version), bs.int2byte(messageId), payload)) return message