Пример #1
0
class ClientSession(threading.Thread):
    def __init__(self, client_conn, client_address, db_conn):
        super(ClientSession, self).__init__()

        self.db_conn = db_conn
        self.client_sock = client_conn
        self.client_address = client_address
        self.sec = Security()

    def send(self, data):
        try:
            self.client_sock.send(self.sec.encrypt(json.dumps(data)))
            print "{} - has been sent to the client".format(data)
            return True

        except socket.SO_ERROR:
            print "Couldn't send data to the server"
            return False

    def recv(self, timeout=True):
        try:
            temp_data = self.client_sock.recv(BUFFER_SIZE)
        except socket.SO_ERROR as s_error:
            print s_error
            return

        if timeout:
            self.client_sock.settimeout(10)

        decrypted_data = self.sec.decrypt(temp_data)
        try:
            return json.loads(decrypted_data)

        except Exception as e:
            print decrypted_data
            print e
            return

    def user_handle(self):
        user_data = self.recv(False)
        print user_data

        # -- Checking if the user exists in the database -- #
        USERNAME = user_data[0]
        PASSWORD = user_data[1]

        if not self.db_conn.user_exists(USERNAME, PASSWORD):
            self.send('400 NOT FOUND')
            return self.user_handle()

        return USERNAME, PASSWORD

    def run(self):

        try:
            self.client_sock.send(self.sec.export_public_key())
            (self.sec.aes_key, self.sec.mode, self.sec.iv) = cPickle.loads(self.client_sock.recv(1024))
            self.sec.create_cipher()

        except:
            print "Unable to continue the connection with {}".format(self.client_address)
            return

        (USERNAME, PASSWORD) = self.user_handle()
        # -- ------------------------------------------- -- #

        self.db_conn.Username = USERNAME
        print self.db_conn.Username
        self.db_conn.user_id = self.db_conn.find_user_id()
        self.send('200 OK')  # If the user exists

        UUID = self.recv()[2]
        self.db_conn.computer_id = UUID

        # -- Checking if the computer's UUID exists in the database -- #

        if not self.db_conn.computer_exists():
            self.send('400 NOT FOUND')

            os_version = self.recv()[2]
            print os_version

            computer_name = self.recv()[2]
            print computer_name

            cpu_model = self.recv()[2]
            print cpu_model

            cpu_num = self.recv()[2]
            print cpu_num

            memo_total_ram = self.recv()[2]
            print memo_total_ram

            self.db_conn.add_computer(os_version, computer_name, cpu_model, cpu_num, memo_total_ram)
            print "Computer has been added"
        else:
            self.send('200 OK')
        # -- ------------------------------------------- -- #

        self.db_conn.computer_activation(True)

        while True:
            try:
                data = self.recv()
            except:
                break
            if type(data) is list:
                self.db_conn.update_query(data)

        self.db_conn.computer_activation(False)
        print "Computer is DEAD"