def __handle_peer(self, client_sock): """ handle_peer( new socket connection ) -> () Dispatches messages from the socket connection """ self.__debug('New child ' + str(threading.currentThread().getName())) self.__debug('Connected ' + str(client_sock.getpeername())) host, port = client_sock.getpeername() conn = Peer(port, client_sock) while True: try: msg_type, msg_data = conn.recv_data() if msg_type: msg_type = msg_type.upper() if msg_type not in self.handlers: self.__debug('Peer msg not handled') # : %s: %s' % (msg_type, msg_data)) break else: self.__debug('Handling peer msg') # : %s: %s' % (msg_type, msg_data)) disconnect = self.handlers[msg_type](conn, msg_data) if disconnect: break except KeyboardInterrupt: raise except: traceback.print_exc() self.__debug('Disconnecting ' + str(client_sock.getpeername())) conn.close()
def testTwoPeerUsage(): from peer import Peer data = ['1', '2', '3'] * dfs_state.CHUNK_SIZE data2 = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'] * dfs_state.CHUNK_SIZE p1 = Peer('localhost', 10001) p2 = Peer('localhost', 10002) p1.open('boobs.txt', 'w') p1.write('boobs.txt', data) p1.close('boobs.txt') p1.markStable('boobs.txt') p1.open('boobs.txt', 'w') p1.write('boobs.txt', data, len(data)) p1.write('boobs.txt', data, len(data) * 2) p1.close('boobs.txt') p1.listFiles() p1.goOnline() changeDevice() p2.goOnline() p2.join(p1) p2.listFiles() p2.open('boobs.txt', 'w') p2.write('boobs.txt', data2, 10) p2.close('boobs.txt') p2.listFiles() p2.goOffline() p1.unpin('boobs.txt') p1.listFiles() p1.open('boobs.txt', 'r') p1.read('boobs.txt', [0]*100) p1.goOffline() p1.delete('boobs.txt') p1.delete('boobs.txt.stable') p1.exit() p2.goOffline() p2.delete('boobs.txt') p2.delete('boobs.txt.stable') p2.exit() log.i('Tests Done!')
def request_encrypted_file(self, host, port, file_name): try: conn = Peer(port) conn.send_data(Peer.SEND_CERT, self.encrypt.get_signed_cert_str()) debug('Sent %s' % Peer.SEND_CERT) msg_reply = conn.recv_data() # debug('Got reply %s' % (str(msg_reply))) debug("Received certificate") if msg_reply[0] != Peer.CERT_RESPONSE_VALID: debug("Certificate validation error.") return if conn.add_peer_cert(msg_reply[1].decode("utf-8")): public_key = conn.peer_cert.public_key() ciphertext = public_key.encrypt( bytes(file_name, 'utf-8'), padding.OAEP( mgf=padding.MGF1(algorithm=hashes.SHA256()), algorithm=hashes.SHA256(), label=None)) conn.send_data(Peer.REQUEST_FILE, ciphertext) else: print("ERROR") debug('Sent %s' % Peer.REQUEST_FILE) try: _substr_index = file_name.rindex('/')+1 except: _substr_index = 0 received_file_name = 'received_'+file_name[_substr_index:] try: os.remove(received_file_name) print('Removed existing file:', received_file_name) os.remove('tmp_recv_encrfile') except OSError: pass while True: msg_reply = conn.recv_data() # debug('Got reply %s' % (str(msg_reply))) if msg_reply == (None, None): break plain_data = self.encrypt.get_private_key().decrypt( msg_reply[1], padding.OAEP( mgf=padding.MGF1(algorithm=hashes.SHA256()), algorithm=hashes.SHA256(), label=None)) with open(received_file_name, 'ab') as f: f.write(plain_data) with open('tmp_recv_encrfile', 'ab') as f: f.write(msg_reply[1]) debug(f"File received written to: {received_file_name}") conn.close() except KeyboardInterrupt: raise except: traceback.print_exc()
def testOfficialUsage(): # Init f11 = 'f11.txt' f12 = 'f12.docx' f13 = 'f13.pptx' f14 = 'f14.txt' f21 = 'f21.executable' f22 = 'f22.zip' f31 = 'f31.jpg' fileNames = [f11, f12, f13, f21, f22, f31] from peer import Peer data = { } for file in fileNames: f = open('files/' + file, 'r') txt = f.read() if file == f22: data[file] = [c for c in txt] else: data[file] = [c for c in txt] * 5 def writeData(d, fileName): d.open(fileName, 'w') d.write(fileName, data[fileName]) d.close(fileName) dv1 = Peer('localhost', 10001) dv1.goOnline() dv2 = Peer('localhost', 10002) dv2.goOnline() dv2.join(dv1) dv3 = Peer('localhost', 10003) dv3.goOnline() dv5 = Peer('localhost', 10005) dv5.goOnline() dv5.join(dv2) writeData(dv1, f11) writeData(dv1, f12) writeData(dv1, f13) writeData(dv2, f21) writeData(dv2, f22) writeData(dv3, f31) log('--------------------- START OF 1 & 2') # 1 & 2 dv1.listFiles() dv2.listFiles() dv1.markStable(f11) dv1.markStable(f12) dv1.markStable(f13) dv2.markStable(f21) dv2.markStable(f22) dv1.listFiles() dv2.listFiles() log('--------------------- START OF 3') # 3 dv2.open(f11, 'r') dv2.open(f12, 'r') dv2.read(f11, [0]*200) dv2.read(f12, [0]*200) dv2.close(f11) dv2.close(f12) dv1.listFiles() dv2.listFiles() log('--------------------- START OF 4') # 4 dv1.goOffline() dv2.open(f11, 'w') dv2.write(f11, 'I am device2 and I like to eat cheese') dv2.close(f11) dv2.open(f12, 'w') dv2.write(f12, 'I am device2 and I hate babbies', 10) dv2.close(f12) dv1.goOnline() dv1.listFiles() dv2.listFiles() log('--------------------- START OF 5') # 5 dv1.pin(f11) dv1.goOffline() dv2.goOffline() dv2.open(f11, 'w') dv2.write(f11, ' THIS TEXT IS BEING INSERTED AT OFFSET 400 BY DEVICE 2 ', 400) dv2.close(f11) dv1.open(f11, 'w') dv1.write(f11, ' I REFUSE TO WRITE WHAT DEVICE 2 SAID, BUT I AM STILL INSERTING AT OFFSET 400 ', 400) dv1.close(f11) dv1.listFiles() dv2.listFiles() dv1.goOnline() dv1.listFiles() dv2.listFiles() dv2.goOnline() dv1.listFiles() dv2.listFiles() log('--------------------- START OF 6a') # 6 a dv1.open(f14, 'w') dv1.write(f14, 'this file is f14' * 20000) dv1.close(f14) dv1.listFiles() dv2.listFiles() log('--------------------- START OF 6b') # 6 b dv1.delete(f11) dv1.listFiles() dv2.listFiles() log('--------------------- START OF 7') # 7 dv3.join(dv1) dv3.listFiles() log('--------------------- START OF 8') # 8 dv3.pin(f12 + '.stable') dv3.listFiles() log('--------------------- START OF 9') # 9 dv3.open(f12 + '.stable', 'r') content = dv3.read(f12 + '.stable') dv3.close(f12 + '.stable') dv3.open(f12, 'w') content = content[:10000] dv3.write(f12, content, 0, len(content), True) dv3.close(f12) dv3.markStable(f12) dv1.listFiles() dv2.listFiles() dv3.listFiles() log('--------------------- START OF 10') # 10 dv3.retire() dv1.listFiles() dv2.listFiles() dv4 = Peer('localhost', 10004) dv4.goOnline() dv4.join(dv1) dv1.listFiles() dv2.listFiles() dv4.listFiles() dv4.pin(f11 + '.p2') dv4.pin(f13) dv4.pin(f22) time.sleep(.5) dv4.listFiles() time.sleep(.5) dv4.listFiles() time.sleep(.5) dv4.listFiles() dv5.listFiles() log('--------------------- END') dv1.exit() dv2.exit() dv3.exit() dv4.exit() dv5.exit()