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)
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()
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()
def probe_client(self, conn): self.respond(conn, Message(PROBE).get_message_json())
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
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()
def disconnect(self): self.send(Message(QUIT, None, self.user)) self.close()
def reg_presence(self): self.send(Message(PRESENCE, None, self.user)) return self.receive()
def del_friend_request(self, friend_login): if friend_login: self.send(Message(DEL_CONTACT, None, self.user, self.friend)) return self.receive()
def friend_list_request(self): self.send(Message(GET_CONTACTS, None, self.user)) return self.receive()
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)