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()
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()
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)
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)
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()
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()
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)