Ejemplo n.º 1
0
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)
Ejemplo n.º 2
0
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)
Ejemplo n.º 3
0
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
Ejemplo n.º 4
0
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)
Ejemplo n.º 5
0
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)
Ejemplo n.º 6
0
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)
Ejemplo n.º 7
0
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)
Ejemplo n.º 8
0
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
Ejemplo n.º 9
0
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)
Ejemplo n.º 10
0
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})
Ejemplo n.º 11
0
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)
Ejemplo n.º 12
0
def get_connections():
    with session_scope(expire=False) as session:
        return session.query(ActiveClient).all()
Ejemplo n.º 13
0
def clear_active_clients_list():
    with session_scope() as session:
        active_connections = session.query(ActiveClient).all()

        for connection in active_connections:
            session.delete(connection)