def recieveFile(self,sock,size): self.fullFilePath = Utils.join(Utils.DOWNLOADS_DIR,self.filePath) directory = os.path.dirname(self.fullFilePath) if not os.path.exists(directory): os.makedirs(directory) remainingsize=size f = open(self.fullFilePath,'wb') self.fle=f count=0 while(1): if remainingsize==0: break elif remainingsize>=Utils.PACKET_SIZE: ret = Utils.bytesToInt(Utils.getPacketOrStop(sock,1,threads=(self))) if ret==0: raise CancelException() packet = Utils.getPacketOrStop(sock,Utils.PACKET_SIZE,threads=(self)) remainingsize = remainingsize-Utils.PACKET_SIZE if count%10==0: percent = format(float(size-remainingsize)/float(size)*100,'.2f') self.tree.set(self.treeItem,"progress",str(percent)+"%")#make this happen not as often count+=1 else: ret = Utils.bytesToInt(Utils.getPacketOrStop(sock,1,threads=(self))) if ret==0: raise CancelException() packet = Utils.getPacketOrStop(sock,remainingsize,threads=(self)) remainingsize=0 f.write(packet) f.close()
def silentExchange(self, sock, addressIP): data = "" + self.secretKey + ";" + self.username size = len(data) sock.send(Utils.EXCHANGE_INFO_HEADER+Utils.intToBytes(size,4)+Utils.stringToBytes(data)) size = Utils.bytesToInt(Utils.getPacketOrStop(sock,4)) resp = Utils.bytesToString(Utils.getPacketOrStop(sock,size)) theirKey,theirID = resp.split(";") self.addNewContact([theirKey, addressIP, theirID]) self.connectToPeer(sock, addressIP)
def run(self): conn = None try: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind((self.sock.getsockname()[0],0)) s.listen(1) message = Utils.FILE_REQUEST+Utils.intToBytes(len(self.filePath),2)+Utils.stringToBytes(self.filePath)+Utils.intToBytes(s.getsockname()[1],2)#need to also send ip address self.sock.send(message) conn,addr = s.accept() succ = True ret = Utils.bytesToInt(Utils.getPacketOrStop(conn,1,threads=(self))) if ret==0: raise CancelException() rec = Utils.getPacketOrStop(conn,9,threads=(self)) control = rec[:4] if control==Utils.SEND_FILE_HEADER: size = Utils.bytesToInt(rec[5:]) self.recieveFile(conn,size) elif control == Utils.FILE_NOT_EXIST_ERR: print("The Requested File Isn't Being Uploaded By The Peer") succ = False else: print("There Was An Error With The Specified File") succ = False conn.close() if succ: self.tree.set(self.treeItem,"progress","Done") self.tree.move(self.treeItem,'',0) else: self.tree.set(self.treeItem,"progress","Failed") self.managerMailbox.put(("THREAD",(self,self.filePath,succ,self.treeItem))) except CancelException: self.tree.set(self.treeItem,"progress","Canceled") self.setCanceled(True) self.cancelDownload(conn) except SystemExit:#stopped by another thread self.cancelDownload(conn) except: print("caught") self.tree.set(self.treeItem,"progress","Failed") print(self.filePath) self.managerMailbox.put(("THREAD",(self,self.filePath,False,self.treeItem)))
def exchangeIDs(self, sock): data = "" + self.username size = len(data) sock.send(Utils.ID_EXCHANGE_HEADER+Utils.intToBytes(size,4)+Utils.stringToBytes(data)) control = Utils.getPacketOrStop(sock,4) if control == Utils.ID_EXCHANGE_HEADER: size = Utils.bytesToInt(Utils.getPacketOrStop(sock,4)) ID = Utils.bytesToString(Utils.getPacketOrStop(sock,size)) return ID else: sock.close()
def verifyResponse(self, sock, info, addressIP): while 1: control = Utils.getPacketOrStop(sock,4) print(control) if control == Utils.VERIFY_HEADER: size = Utils.bytesToInt(Utils.getPacketOrStop(sock,4)) resp = Utils.bytesToString(Utils.getPacketOrStop(sock,size)) myKey,theirID = resp.split(";") if info == None: info = self.getUserInfo(addressIP, theirID) return myKey == self.secretKey and not info == None and info[2] == theirID elif control== Utils.EXCHANGE_INFO_HEADER: return Utils.EXCHANGE_INFO_HEADER else: return False
def exhangeInfoWithNewContact(self, sock, addressIP): data = "" + self.secretKey + ";" + self.username size = len(data) sock.send(Utils.EXCHANGE_INFO_HEADER+Utils.intToBytes(size,4)+Utils.stringToBytes(data)) control = Utils.getPacketOrStop(sock,4) if control == Utils.GO_AHEAD_HEADER: control = Utils.getPacketOrStop(sock,4) if control == Utils.EXCHANGE_INFO_HEADER: size = Utils.bytesToInt(Utils.getPacketOrStop(sock,4)) resp = Utils.bytesToString(Utils.getPacketOrStop(sock,size)) theirKey,theirID = resp.split(";") self.addNewContact([theirKey, addressIP, theirID]) self.connectToPeer(sock, addressIP) else: sock.close()
def run(self): while 1: control = Utils.getPacketOrStop(self.sock,4,function=self.listeningThread.disconnectThread,peer=self,isServer=True) print(control) if control == Utils.FILE_REQUEST: size = Utils.bytesToInt(Utils.getPacketOrStop(self.sock,2,function=self.listeningThread.disconnectThread,peer=self,isServer=True)) fileName = Utils.bytesToString(Utils.getPacketOrStop(self.sock,size,function=self.listeningThread.disconnectThread,peer=self,isServer=True)) port = Utils.bytesToInt(Utils.getPacketOrStop(self.sock,2,function=self.listeningThread.disconnectThread,peer=self,isServer=True)) self.managerMailbox.put(("FILES",[self.ip,port,fileName])) elif control == Utils.MESSAGE_HEADER: size = Utils.bytesToInt(Utils.getPacketOrStop(self.sock,4,function=self.listeningThread.disconnectThread,peer=self,isServer=True)) data = Utils.bytesToString(Utils.getPacketOrStop(self.sock,size,function=self.listeningThread.disconnectThread,peer=self,isServer=True)) self.putOtherMessageInChat(data) elif control == Utils.LIST_HEADER: folderStruc = Utils.listfolder(Utils.UPLOADS_DIR)[0] encodedStruc = pickle.dumps(folderStruc) size = len(encodedStruc) self.sock.send(Utils.LIST_RES_HEADER+Utils.intToBytes(size,4)+encodedStruc) elif control == Utils.LIST_RES_HEADER: size = Utils.bytesToInt(Utils.getPacketOrStop(self.sock,4,function=self.listeningThread.disconnectThread,peer=self,isServer=True)) self.peerFolderStruc = pickle.loads(Utils.getPacketOrStop(self.sock,size,function=self.listeningThread.disconnectThread,peer=self,isServer=True)) strippedStruc = self.stripFolderStruc(self.peerFolderStruc,"") self.client.setFolderStruc(strippedStruc) if(self.listeningThread.isCurrentServer(self)): self.fillBrowseTree() elif control == Utils.QUERY_IP_HEADER: size = Utils.bytesToInt(Utils.getPacketOrStop(self.sock,4,function=self.listeningThread.disconnectThread,peer=self,isServer=True)) ID = Utils.bytesToString(Utils.getPacketOrStop(self.sock,size,function=self.listeningThread.disconnectThread,peer=self,isServer=True)) info = self.listeningThread.getUserInfo(None, ID) if(info is not None): data = "" + ID + ";" + info[1] size = len(data) self.sock.send(Utils.QUERY_IP_FOUND_HEADER+Utils.intToBytes(size,4)+Utils.stringToBytes(data)) else: data = "" + ID size = len(data) self.sock.send(Utils.QUERY_IP_FAILED_HEADER+Utils.intToBytes(size,4)+Utils.stringToBytes(data)) elif control == Utils.QUERY_IP_FAILED_HEADER: pass elif control == Utils.QUERY_IP_FOUND_HEADER: size = Utils.bytesToInt(Utils.getPacketOrStop(self.sock,4,function=self.listeningThread.disconnectThread,peer=self,isServer=True)) resp = Utils.bytesToString(Utils.getPacketOrStop(self.sock,size,function=self.listeningThread.disconnectThread,peer=self,isServer=True)) ID,IP = resp.split(";") self.listeningThread.foundIPAddress((IP, ID)) elif control==Utils.BEAT_HEADER: pass