Beispiel #1
0
 def send_message(self):
     if self.client:
         msg_input = self.ids['tiMessage']
         msg_text = msg_input.text
         if self.selected_friend or self.selected_friend_login == COMMON_CHAT:
             if self.selected_friend_login == COMMON_CHAT:
                 msg = Message(BROADCAST, msg_text, self.client.user)
             else:
                 msg = Message(MSG, msg_text, self.client.user,
                               self.selected_friend)
             if self.client.send(msg):
                 self.client.db.store_message(msg)
             msg_input.text = ''
             self.change(self.selected_friend_login)
Beispiel #2
0
 def send_message(self):
     mi = self.msg_input
     if bool(mi.toPlainText()):
         message_html = mi.toHtml()
         if self.selected_friend or self.selected_friend_login == COMMON_CHAT:
             message_html = self.convert_qt_tags(message_html)
             if self.selected_friend_login == COMMON_CHAT:
                 msg = Message(BROADCAST, message_html, self.client.user)
             else:
                 msg = Message(MSG, message_html, self.client.user,
                               self.selected_friend)
             if self.client.send(msg):
                 self.client.db.store_message(msg)
             mi.clear()
             self.set_chat_with()
Beispiel #3
0
 def add_item_to_contact_list(self):
     entered_login = self.mainForm.lineEditAddContact.text().strip()
     if bool(entered_login):
         friend = self.db.add_non_verified(entered_login)
         self.mainForm.listWidgetContacts.addItem(entered_login)
         self.mainForm.lineEditAddContact.clear()
         self.client.send(
             Message(ADD_CONTACT, None, self.client.user, friend))
         self.client.updated = False
     else:
         self.load_contact_list()
Beispiel #4
0
 def probe_client(self, conn):
     self.respond(conn, Message(PROBE).get_message_json())
Beispiel #5
0
    def _route_in(self):
        sleep(1)
        if self._queue_in.not_empty:
            struct = self._queue_in.get()
            w_jmessage = struct[WRITER_MESSAGE]
            conn = struct[WRITER_SOCKET]

            print('PROCESSED: {}'.format(w_jmessage))

            cli_msg = Message(w_jmessage[ACTION])
            if cli_msg.action == QUIT:
                self.reset_socket(conn)
                return

            if MESSAGE in w_jmessage:
                cli_msg.message = w_jmessage[MESSAGE]
                # сохраним в mongodb
                if self.mongo:
                    self.mongo.store(w_jmessage)

            if USER_ID in w_jmessage:
                cli_msg.user = self.storage.get_user_by_id(w_jmessage[USER_ID])
            elif USER_LOGIN in w_jmessage:
                cli_msg.user = self.storage.get_user_by_login(
                    w_jmessage[USER_LOGIN])

            if FRIEND_ID in w_jmessage:
                cli_msg.friend = self.storage.get_user_by_id(
                    w_jmessage[FRIEND_ID])
            elif FRIEND_LOGIN in w_jmessage:
                cli_msg.friend = self.storage.get_user_by_login(
                    w_jmessage[FRIEND_LOGIN])

            if PASSWORD in w_jmessage:
                cli_msg.password = w_jmessage[PASSWORD]

            action = cli_msg.action
            if action == MSG:
                if self.socket_authorized(conn):
                    if cli_msg.friend in self.connected_users:
                        destination_socket = self.connected_users[
                            cli_msg.friend]
                        if destination_socket:
                            self._queue_out.put({
                                DESTINATION_SOCKET: destination_socket,
                                MSG: cli_msg
                            })
                    else:
                        print('FRIEND IS OFFLINE: {}'.format(cli_msg.friend))
                else:
                    print('NOT AUTHORIZED TO SEND MESSAGES: {}'.format(
                        cli_msg.user))
                    # retrieve auth
                    resp = dict_to_bytes({
                        ACTION: AUTH,
                        RESPONSE: NON_AUTH_CODE
                    })
                    self._queue_out.put({
                        DESTINATION_SOCKET: conn,
                        RESPONSE: resp
                    })

            elif action == BROADCAST:
                if self.socket_authorized(conn):
                    if cli_msg.user and cli_msg.message:
                        self._queue_out.put({BROADCASTER: conn, MSG: cli_msg})
                    else:
                        resp = dict_to_bytes({
                            ACTION: BROADCAST,
                            RESPONSE: BAD_QUERY_CODE
                        })
                        self._queue_out.put({
                            DESTINATION_SOCKET: conn,
                            RESPONSE: resp
                        })

            elif action == AUTH:
                response_code = None
                if self.socket_authorized(conn):  # auth already
                    response_code = OK_CODE
                else:
                    if hasattr(cli_msg, PASSWORD):
                        if bool(cli_msg.password):
                            check_hash = self.encrypt_string(cli_msg.password)
                            auth_ok = hmac.compare_digest(
                                cli_msg.user.password, check_hash)
                            if auth_ok:
                                response_code = OK_CODE
                                self.authenticated_users.append(conn)
                                # обновим юзера в словаре подключенных сокетов
                                # т.к после презенс в юзере может быть NONE если входим из gui
                                self.del_from_connected(conn)
                                self.connected_users[cli_msg.user] = conn
                            else:
                                response_code = NON_VALID_CREDENTIALS_CODE
                if response_code:
                    resp = dict_to_bytes({
                        ACTION: AUTH,
                        RESPONSE: response_code
                    })
                    self._queue_out.put({
                        DESTINATION_SOCKET: conn,
                        RESPONSE: resp
                    })

            elif action == PRESENCE:
                if self.socket_authorized(conn):  # auth already
                    self._queue_out.put({
                        DESTINATION_SOCKET:
                        conn,
                        RESPONSE:
                        ServerResponse(cli_msg).build_response()
                    })
                else:
                    if cli_msg.user:
                        hash = cli_msg.user.password
                        if not bool(hash):
                            # create pass
                            new_pass = self.generate_random_password()
                            # предполагается, что новый пароль сообщим юзеру на почту или смс
                            strpass = '******'.format(
                                cli_msg.user, new_pass)
                            # запишу пока в файл, для отладки
                            with open('passwords.txt', 'a') as txt:
                                txt.write('\n' + strpass)

                            new_hash = self.encrypt_string(new_pass)
                            self.storage.set_user_hash(new_hash,
                                                       user=cli_msg.user)

                        # retrieve auth
                        resp = dict_to_bytes({
                            ACTION: AUTH,
                            RESPONSE: NON_AUTH_CODE
                        })
                        self._queue_out.put({
                            DESTINATION_SOCKET: conn,
                            RESPONSE: resp
                        })

                    if cli_msg.user not in self.connected_users:
                        # запомнить соответствие юзера и сокета
                        self.connected_users[cli_msg.user] = conn
                        self._queue_out.put({
                            DESTINATION_SOCKET:
                            conn,
                            RESPONSE:
                            ServerResponse(cli_msg).build_response()
                        })
                        return

            elif action in CONTACT_OPS:
                if self.socket_authorized(conn):
                    self._queue_out.put({
                        DESTINATION_SOCKET:
                        conn,
                        RESPONSE:
                        ServerResponse(cli_msg).build_response()
                    })
                    return
Beispiel #6
0
 def auth_request(self, password, _user=None):
     if not _user:
         _user = self.user
     if bool(password):
         self.send(Message(AUTH, None, _user, None, password))
         return self.receive()
Beispiel #7
0
 def disconnect(self):
     self.send(Message(QUIT, None, self.user))
     self.close()
Beispiel #8
0
 def reg_presence(self):
     self.send(Message(PRESENCE, None, self.user))
     return self.receive()
Beispiel #9
0
 def del_friend_request(self, friend_login):
     if friend_login:
         self.send(Message(DEL_CONTACT, None, self.user, self.friend))
         return self.receive()
Beispiel #10
0
 def friend_list_request(self):
     self.send(Message(GET_CONTACTS, None, self.user))
     return self.receive()
Beispiel #11
0
                if cli.registered:
                    if not cli.updated:
                        cli.sync_remote_contacts()
                    else:
                        user_input = input('(chat) >')
                        args = user_input.split()

                        if user_input.startswith('message'):
                            to = args[1]
                            # todo: take all words
                            msg_text = args[2]

                            if bool(msg_text):
                                friend = cli.db.get_user_by_login(to)
                                if friend:
                                    msg = Message(MSG, msg_text, cli.user,
                                                  friend)
                                    if cli.send(msg):
                                        cli.db.store_message(msg)
                                else:
                                    print('! There is no user with name: {}'.
                                          format(to))
                        elif user_input.startswith('list'):
                            res = cli.contacts.get_friends(user=IAM)
                            for friend in res[IAM]:
                                print(friend.user_id, friend.login)
                        elif user_input.startswith('quit'):
                            cli.disconnect()
                            break
                        elif user_input.startswith(
                                'help') or user_input.startswith('?'):
                            print(HELP_CLI)