def remove_from_active_clients(addr, port): with session_scope() as session: active_client = session.query(ActiveClient).filter( and_(ActiveClient.addr == addr, ActiveClient.port == port)).first() if active_client: session.delete(active_client)
def add_client_to_active_list(request, client): client_address = request.get('address').get('remote') addr = client_address.get('addr') port = client_address.get('port') created = datetime.fromtimestamp(request.get('time')) with session_scope() as session: if client: active_client = ActiveClient(client_id=client.id, client_name=client.name, addr=addr, port=port, created=created) session.add(active_client)
def authenticate(login, password): """Authenticate client based on valid login and password.""" with session_scope() as session: client = session.query(Client).filter_by(name=login).first() hmac_obj = hmac.new(SECRET_KEY.encode(), password.encode(), digestmod='sha256') password_digest = hmac_obj.hexdigest() if client and hmac.compare_digest(password_digest.encode(), client.password.encode()): active_session = client.sessions.filter_by(closed=None).first() if active_session: raise ValueError return client
def logout_controller(request): with session_scope(expire=False) as session: client_session = session.query(ClientSession).filter_by(token=request.get('token')).first() if client_session: client_session.closed = datetime.now() data = 'Client session closed.' code = 200 else: data = {'errors': 'Client session not found.'} code = 404 if client_session: addr, port = client_session.remote_addr, client_session.remote_port remove_from_active_clients(addr, port) return make_response(request, code, data)
def message_controller(request): errors = get_validation_errors(request, 'text', 'to_client') if errors: return make_response(request, 400, {'errors': errors}) request_data = request.get('data') to_client = request_data.get('to_client') text = request_data.get('text') with session_scope() as session: try: to_client = session.query(Client).filter_by(name=to_client).first() except AttributeError: data = f'Client "{to_client}" not found.' return make_response(request, 404, data) else: from_client = session.query(ClientSession).filter_by(token=request.get('token')).first().client from_client_id = from_client.id to_client_id = to_client.id message = Message( text=text, from_client_id=from_client_id, to_client_id=to_client_id, created=datetime.fromtimestamp(request.get('time')) ) session.add(message) data = { 'text': text, 'to_client': to_client.name, 'from_client': from_client.name, 'time': request.get('time') } to_client_session = to_client.sessions.filter_by(closed=None).first() if to_client_session: addr, port = to_client_session.remote_addr, to_client_session.remote_port r_addr = get_socket_info(addr, port) return make_response(request, 200, data, r_addr) return make_response(request, 200, data)
def del_message_controller(request): errors = get_validation_errors(request, 'message_id') if errors: return make_response(request, 400, {'errors': errors}) request_data = request.get('data') message_id = request_data.get('message_id') with session_scope() as session: messages = session.query(ClientSession).filter_by(token=request.get('token')).first().client.sent_messages message = messages.filter_by(id=message_id).first() if message: session.delete(message) data = {'message_id': message_id} return make_response(request, 200, data) else: data = f'Message with id #{message_id} not found.' return make_response(request, 404, data)
def del_contact_controller(request): errors = get_validation_errors(request, 'friend') if errors: return make_response(request, 400, {'errors': errors}) request_data = request.get('data') friend_name = request_data.get('friend') with session_scope() as session: client = session.query(ClientSession).filter_by(token=request.get('token')).first().client friend_list = client.friends.all() for friend in friend_list: if friend.friend_contact.name == friend_name: session.delete(friend) data = {'deleted_friend': friend_name} return make_response(request, 200, data) data = f'Client "{friend_name}" not found in "{client.name}" friend list.' return make_response(request, 404, data)
def login(request, client): """Make client session (logging in) and get token for client.""" with session_scope(expire=False) as session: hash_obj = hashlib.sha256() hash_obj.update(SECRET_KEY.encode('UTF-8')) hash_obj.update(str(request.get('time')).encode('UTF-8')) token = hash_obj.hexdigest() socket_info = request.get('address') remote_socket_info = socket_info.get('remote') local_socket_info = socket_info.get('local') client_session = ClientSession( client=client, token=token, remote_addr=remote_socket_info.get('addr'), remote_port=remote_socket_info.get('port'), local_addr=local_socket_info.get('addr'), local_port=local_socket_info.get('port')) session.add(client_session) return token
def upd_message_controller(request): errors = get_validation_errors(request, 'message_id', 'new_text') if errors: return make_response(request, 400, {'errors': errors}) request_data = request.get('data') message_id = request_data.get('message_id') new_text = request_data.get('new_text') with session_scope() as session: messages = session.query(ClientSession).filter_by(token=request.get('token')).first().client.sent_messages message = messages.filter_by(id=message_id).first() if message: message.text = new_text message.edited = True data = {'message_id': message_id, 'new_text': new_text} return make_response(request, 200, data) else: data = f'Message with id #{message_id} not found.' return make_response(request, 404, data)
def presence_controller(request): client_name = request.get('data').get('client') is_active_session = False with session_scope() as session: client = session.query(Client).filter_by(name=client_name).first() if client: active_session = client.sessions.filter_by(closed=None).first() if active_session: # TODO: Вместо проверки IP сделать проверку MAC, внести изменения в протокол last_addr = active_session.remote_addr current_addr = request.get('address').get('remote').get('addr') if last_addr == current_addr: active_session.closed = datetime.now() is_active_session = True token = None if is_active_session: token = login(request, client) add_client_to_active_list(request, client) return make_response(request, 200, {'token': token})
def get_contacts_controller(request): # TODO: реализован на клиенте, удалить with session_scope() as session: contacts = session.query(ClientSession).filter_by(token=request.get('token')).first().client.friends.all() data = {'contacts': contacts} return make_response(request, 200, data)
def get_connections(): with session_scope(expire=False) as session: return session.query(ActiveClient).all()
def clear_active_clients_list(): with session_scope() as session: active_connections = session.query(ActiveClient).all() for connection in active_connections: session.delete(connection)