Exemple #1
0
 def delete_contact(self, connection, username, contact_name):
     session = self.db.Session()
     try:
         user = self.db.get_user_by_username(session, username)
         contact = self.db.get_user_by_username(session, contact_name)
         self.db.delete_related(session, user, contact)
         response = msg.Response(206, contact_name)
         # response.add_key_value('contact', contact_name)
         self.send_encrypted_message(connection, response, binary=False)
         self.listener.new_message('Client {} deleted contact: {}'.format(
             username, contact_name))
     except:
         response = msg.Response(406, 'contact_delete_error')
         self.send_encrypted_message(connection, response, binary=False)
         log_record = "problem deleting contact"
         self.listener.new_message(log_record)
         lg.logger.error(
             'Main thread; delete contact:{} - {}; delete contact error'.
             format(username, contact_name))
     finally:
         session.close()
Exemple #2
0
 def add_contact(self, connection, username, contact_name):
     session = self.db.Session()
     try:
         user = self.db.get_user_by_username(session, username)
         contact = self.db.get_user_by_username(session, contact_name)
         self.db.add_related(session, user, contact)
         response = msg.Response(205, 'contact_add_ok')
         self.send_encrypted_message(connection, response, binary=False)
         self.send_contact(connection, contact)
         self.listener.new_message('Client {} added contact: {}'.format(
             username, contact_name))
     except:
         response = msg.Response(405, 'contact_add_error')
         self.send_encrypted_message(connection, response, binary=False)
         log_record = "problem adding contact"
         self.listener.new_message(log_record)
         lg.logger.error(
             'Main thread; add contact:{} - {}; add contact error'.format(
                 username, contact_name))
     finally:
         session.close()
Exemple #3
0
 def send_contacts(self, connection, username):
     session = self.db.Session()
     user = self.db.get_user_by_username(session, username)
     contact_list = user.related
     response_message = msg.Response(202, str(len(contact_list)))
     self.send_encrypted_message(connection, response_message, binary=False)
     for contact in contact_list:
         self.send_contact(connection, contact)
     session.close()
     self.listener.new_message(
         'Client {} asked for contacts'.format(username))
     self.send_postponed(connection, username)
Exemple #4
0
 def broadcast(self, text_message, omit=None):
     self.listener.new_message('Broadcast message: {}'.format(text_message))
     for sock in self.clients:
         if sock != omit:
             try:
                 log_record = 'broadcast message: %s' % text_message
                 self.log.append(log_record)
                 broadcast_message = msg.Response(300)
                 broadcast_message.alert = text_message
                 self.send_encrypted_message(sock,
                                             broadcast_message,
                                             binary=False)
             except:
                 self.socket_unavailable(sock)
Exemple #5
0
    def forward_personal_message(self, connection, message):
        username = message.user
        dest = message.dest
        message_text = message.text
        log_record = 'new personal pmesssage: from:{}; to: {};'.format(
            username, dest)
        self.listener.new_message(log_record)
        self.log.append(log_record)

        # создаем сообщение для отправки
        forward_message = msg.MessagePersonalFrom(username, message_text)
        # находим в списке connected users и выявняем его сокет
        session = self.db.Session()
        user = self.db.get_user_by_username(session, dest)
        if user is not None:
            if len(user.connected_user) > 0:
                c_user = user.connected_user[0]
                fd = c_user.fd
                user_sock = None
                for sock in self.clients:
                    if sock.fileno() == fd:
                        user_sock = sock
                        break
                log_record = 'forwarding message to {}'.format(str(user_sock))
                self.log.append(log_record)
                self.send_encrypted_message(user_sock,
                                            forward_message,
                                            binary=False)
            else:
                postponed_message = user_db.PostponedMessages(
                    user.id, forward_message.get_binary_json('utf-8'))
                user.postponed.append(postponed_message)
                session.commit()
                response = msg.Response(
                    404, 'user is not connected, message saved to postponed')
                self.send_encrypted_message(connection, response, binary=False)
        session.close()
Exemple #6
0
    def authenticate_client(self, client_connection, message):
        #читаем сообщение от указанного клинета
        user_data = message.user
        username = user_data['account_name']
        password = user_data['password']
        # fd = str(client_connection.fileno())
        self.listener.new_message(
            'Client {} asked for authentification'.format(username))

        session = self.db.Session()
        user = self.db.get_user_by_username(session, username)
        #если такого пользователя нет
        if user == None:
            # если пользователь не существует, добавить нового пользователя
            newuser = self.db.add_user_by_fields(session, username, username,
                                                 password)
            self.users.append(newuser)
            # уведомляем пользователя о добавлении в базу данных
            resp_message = msg.Response(
                200, 'user does not exist, new user created with username %s' %
                username)
            self.send_encrypted_message(client_connection,
                                        resp_message,
                                        binary=False)

            # добавляем в базу данных
            self.db.add_connected_user(session, client_connection.fileno(),
                                       newuser)
            self.new_user_online(session, username)

            # добавляем запись в лог и сообщаяем всем о новом клиенте в сети
            log_record = 'Client \'{}\'({}) registered and authenticated'.format(
                username, client_connection.getpeername())
            self.listener.new_message(log_record)
            self.log.append(log_record)

        # если пароль неверный
        elif password != user.password:
            # отправить сообщение
            resp_message = msg.Response(402, 'Password incorrect')
            self.send_encrypted_message(client_connection,
                                        resp_message,
                                        binary=False)
            #не подключаем клиента
            self.clients.remove(client_connection)
            self.listener.new_message(
                'Client {}: incorrect password'.format(username))
        #если все верно
        else:
            # добавляем в базу данных
            self.db.add_connected_user(session, client_connection.fileno(),
                                       user)

            # сообщяем клиенту об успешной аутентификацц
            resp_message = msg.Response(200, 'Successfully authenticated')
            self.send_encrypted_message(client_connection,
                                        resp_message,
                                        binary=False)

            # добавляем запись в лог и сообщаяем всем о новом клиенте в сети
            address = client_connection.getpeername()
            log_record = 'Client \'{}\' ({}) authenticated.'.format(
                username, address)
            self.listener.new_message(log_record)
            self.log.append(log_record)
            self.new_user_online(session, username)
        session.close()
Exemple #7
0
 def send_session_key_ok(self, connection):
     message_session_key_ok = msg.Response(200, 'session_key_ok')
     self.send_encrypted_message(connection,
                                 message_session_key_ok,
                                 binary=False)