Source code for network.network_thread
# -*- coding: utf-8 -*-
import socket
from PyQt5.QtCore import QThread, pyqtSignal
import logging
import nacl.utils
import nacl.secret
import nacl.hash
from nacl.exceptions import CryptoError
class _NetworkThread(QThread):
got_connection = pyqtSignal()
connection_error = pyqtSignal(str)
new_msg = pyqtSignal(str)
def __init__(self, target_ip, port, passwd):
QThread.__init__(self)
self.port = int(port)
self.mode = None
self.target_ip = target_ip
self.socket = None
self.running = True
self.server_socket = None
keyhash = nacl.hash.blake2b(passwd.encode('ascii'), digest_size=16)
self.secret_box = nacl.secret.SecretBox(keyhash)
def send_raw(self, msg):
# logging.debug("[raw network pocket send] "+msg)
msg = self.secret_box.encrypt(msg.encode('ascii'))
self.socket.send(msg)
def recive_raw(self):
msg = self.socket.recv(1024)
try:
msg = self.secret_box.decrypt(msg)
except CryptoError:
#self.connection_error.emit("Wrong password")
#self.running = False
return ""
msg = msg.decode('ascii')
# logging.debug("[raw network pocket recived] "+msg)
return msg
def __del__(self):
self.quit()
self.wait()
[docs]class NetworkClient(_NetworkThread):
[docs] def run(self):
self.mode = "client"
logging.info("Connecting to :" + str(self.target_ip))
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
self.socket.connect((self.target_ip, self.port))
logging.debug("Connection sucessful")
if self.recive_raw() != "welcome":
self.connection_error.emit("Wrong Password")
return
self.send_raw("welcomeback")
self.got_connection.emit()
self.socket.settimeout(1)
while self.running:
try:
msg = self.recive_raw()
if msg == "":
break
self.new_msg.emit(msg)
except socket.timeout:
continue
except socket.error as err:
logging.debug("SOCKET ERROR: %s" % err)
self.connection_error.emit(str(err))
return
finally:
self.socket.close()
logging.debug("Server Closed")
[docs]class NetworkServer(_NetworkThread):
[docs] def run(self):
self.mode = "server"
logging.info("Hosting :" + str(self.target_ip))
self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
self.server_socket.bind((self.target_ip, self.port))
logging.debug("Server ready for network")
self.server_socket.settimeout(1)
self.server_socket.listen(1)
while self.running:
try:
self.socket, clienta_ddr = self.server_socket.accept()
except socket.timeout:
continue
break
if not self.running:
logging.debug("Hosting canceled")
return
logging.debug("Connection established.")
self.send_raw("welcome")
if self.recive_raw() != "welcomeback":
self.connection_error.emit("Wrong Password")
return
self.got_connection.emit()
self.socket.settimeout(1)
while self.running:
try:
msg = self.recive_raw()
if msg == "":
break
self.new_msg.emit(msg)
except socket.timeout:
continue
except socket.error as err:
logging.debug("SOCKET ERROR: %s" % err)
self.server_socket.close()
self.server_socket = None
self.connection_error.emit("Connection error.")
finally:
if self.socket is not None:
self.socket.close()
if self.server_socket is not None:
self.server_socket.close()
logging.debug("Server Closed")