Beispiel #1
0
def on_insert_userservice_user(items):
    """
    Hook before inserting a user / user service relation.

    A user wants to use a service

    :param items: list of items (list because can use bulk)
    :type items: list
    :return: None
    """
    for index, item in enumerate(items):
        print " service '%s' and user '%s' " % (item['userservice'], item['user'])
        # Search if opened session still exists for required service ...
        _userservice_user = app.data.driver.db['userservice_user']
        userservice_user = _userservice_user.find_one({
            'userservice': item['userservice'], 'user': item['user']
        })
        if userservice_user:
            # Relation exists ...
            abort(_prepare_response(
                'userservice_user',
                {
                    "_status": "KO",
                    "_id": "%s" % userservice_user['_id'],
                    "content": "A relation for the service '%s' and the user '%s' still exists. "
                               % (item['userservice'], item['user'])
                },
                status=412
            ))

        # Check provided service identifier
        _services = app.data.driver.db['userservice']
        service = _services.find_one({'_id': item['userservice']})
        if not service:  # pragma: no cover - probably unuseful ... Eve checks for existence !
            # Service not found...
            abort(_prepare_response(
                'userservice_user',
                {
                    "_status": "KO",
                    "content": "No service found with _id: %s." % item['userservice']
                },
                status=412
            ))

        # Search if user exists...
        _users = app.data.driver.db['user']
        user = _users.find_one({'_id': item['user']})
        if not user:  # pragma: no cover - probably unuseful ... Eve checks for existence !
            # User not found ...
            abort(_prepare_response(
                'userservice_user',
                {"_status": "KO", "content": "No user found with _id: %s." % item['user']},
                status=412
            ))
Beispiel #2
0
def on_insert_userservice_session(items):
    """
    Hook before creating a new session:
    - If service_name is provided, then reference corresponding userservice
    - Set session opening_date

    :param items:
    :return: None
    """
    for index, item in enumerate(items):
        # Search if opened session still exists for required service ...
        _userservice_session = app.data.driver.db['userservice_session']
        userservice_session = _userservice_session.find_one({
            'service_name': item['service_name'], 'status': 'open'
        })
        if userservice_session:
            # Session exists ...
            print "Session '%s' still exists for the service: %s" % (
                userservice_session['_id'], item['service_name']
            )
            abort(_prepare_response(
                'userservice_session',
                {
                    "_status": "KO",
                    "_id": "%s" % userservice_session['_id'],
                    "content": "A session for the service '%s' still exists. "
                               "You cannot create a new session for this service."
                               % item['service_name']
                },
                status=412
            ))

        # Check provided service name
        _userservice = app.data.driver.db['userservice']
        userservice = _userservice.find_one({'name': item['service_name']})
        if not userservice:
            # Service name does not exists ...
            abort(_prepare_response(
                'userservice_session',
                {
                    "_status": "KO",
                    "content": "Provided service name '%s' does not exist." % item['service_name']
                },
                status=412
            ))
        item['userservice'] = userservice['_id']

        # Set session opening date...
        item['opening_date'] = datetime.utcnow()
Beispiel #3
0
def login_app():
    """
    Log in to backend
    """
    posted_data = None
    if request.form:
        posted_data = request.form
    else:
        if request.json:
            posted_data = request.json
    if not posted_data:
        abort(401, description='No data provided in the login request')

    if 'username' not in posted_data or 'password' not in posted_data:
        abort(
            401,
            description='Missing credentials in posted data (username and password are mandatory)'
        )
    elif not posted_data['username'] or not posted_data['password']:
        abort(
            401,
            description='Username and password must be provided as credentials for login.'
        )
    else:
        print "Login request for: %s" % (posted_data['username'])
        _users = app.data.driver.db['user']
        user = _users.find_one({'name': posted_data['username']})
        if user:
            print "Found user in database: %s" % user['name']
            if check_password_hash(user['password'], posted_data['password']):
                print "User authenticated"
                if 'action' in posted_data:
                    if posted_data['action'] == 'generate' or not user['token']:
                        token = generate_token()
                        _users.update({'_id': user['_id']}, {'$set': {'token': token}})
                        print "New user's token generated:", token
                        return _prepare_response('', {'token': token})
                elif not user['token']:  # pragma: no cover - should not happen (security)
                    token = generate_token()
                    _users.update({'_id': user['_id']}, {'$set': {'token': token}})
                    print "New user's token generated"
                    return _prepare_response('', {'token': user['token']})
                return _prepare_response('', {'token': user['token']})
        abort(401, description='Please provide proper credentials')
Beispiel #4
0
def on_update_userservice_session_user(updates, original):
    """
    Hook before updating a user service session user.

    Updating a session user is to be used by a user to leave the session


    :param updates: list of fields to update
    :type updates: dict
    :param original: list of original fields
    :type original: dict
    :return: None
    """
    # Search if provided username is a member of the required session ...
    if 'username' in updates and updates['username']:
        _users = app.data.driver.db['user']
        user = _users.find_one({'name': updates['username']})
        if user:
            _userservice_session_user = app.data.driver.db['userservice_session_user']
            userservice_session_user = _userservice_session_user.find_one({
                'userservice_session': original['userservice_session'],
                'user': user['_id']
            })
            if not userservice_session_user:  # pragma: no cover
                # Already left or not in ...
                abort(_prepare_response(
                    'userservice_session_user',
                    {
                        "_status": "KO",
                        "content": "User %s is not member or already left this session."
                                   % updates['user']
                    },
                    status=412
                ))

            updates['user'] = user['_id']
            updates['username'] = user['name']
        else:  # pragma: no cover - should never happen!
            # User not found ...
            abort(_prepare_response(
                'userservice_session_user',
                "No user found with username: %s." % updates['username'],
                status=412
            ))

    elif 'user' in updates and updates['user']:
        _users = app.data.driver.db['user']
        user = _users.find_one({'_id': updates['user']})
        if user:
            _userservice_session_user = app.data.driver.db['userservice_session_user']
            userservice_session_user = _userservice_session_user.find_one({
                'userservice_session': original['userservice_session'],
                'user': updates['user']
            })
            if not userservice_session_user:  # pragma: no cover - should never happen!
                # Already left or not in ...
                abort(_prepare_response(
                    'userservice_session_user',
                    {
                        "_status": "KO",
                        "content": "User %s is not member or already left this session."
                                   % updates['user']
                    },
                    status=412
                ))

            updates['user'] = user['_id']
            updates['username'] = user['name']
        else:  # pragma: no cover - should never happen!
            # User not found ...
            abort(_prepare_response(
                'userservice_session_user',
                {"_status": "KO", "content": "No user found with _id: %s." % updates['user']},
                status=412
            ))

    else:
        _userservice_session_user = app.data.driver.db['userservice_session_user']
        userservice_session_user = _userservice_session_user.find_one({
            'userservice_session': original['userservice_session'],
            'user': g.get('users_id', None)
        })
        if not userservice_session_user:
            # Already left or not in ...
            abort(_prepare_response(
                'userservice_session_user',
                {"_status": "KO", "content": "You have not joined this session."},
                status=412
            ))

        updates['user'] = g.get('users_id', None)
        updates['username'] = g.get('users_name', None)

    # Ok ... no tracking about this.
    del updates['username']
Beispiel #5
0
def on_insert_userservice_session_user(items):
    """
    Hook before inserting a user / session relation.

    A user wants to join a session

    :param items: list of items (list because can use bulk)
    :type items: list
    :return: None
    """
    for index, item in enumerate(items):
        # Search if opened session still exists for required service ...
        _userservice_session = app.data.driver.db['userservice_session']
        userservice_session = _userservice_session.find_one({
            'service_name': item['service_name'], 'status': 'open'
        })
        if not userservice_session:  # pragma: no cover - should never happen!
            # No opened session exists ...
            abort(_prepare_response(
                'userservice_session_user',
                {
                    "_status": "KO",
                    "content": "No session is opened for the service '%s'. "
                               "You should create a new session for this service." %
                               item['service_name']
                },
                status=412
            ))
        item['userservice_session'] = userservice_session['_id']
        print "Session: %s is opened for service: %s" % (
            item['userservice_session'], item['service_name']
        )

        # Search if user already joined the required session ...
        if 'username' in item and item['username']:
            print "Current logged-in user '%s' wants to make user '%s' join the session '%s'" % (
                g.get('users_name', None), item['username'], item['userservice_session']
            )
            _users = app.data.driver.db['user']
            user = _users.find_one({'name': item['username']})
            if user:
                item['user'] = user['_id']
                del item['username']

                user_id = user['_id']
                user_name = user['name']
            else:
                # User not found ...
                abort(_prepare_response(
                    'userservice_session_user',
                    {
                        "_status": "KO",
                        "content": "No user found with name: %s." % item['username']
                    },
                    status=412
                ))

        elif 'user' in item and item['user']:
            print "Current logged-in user '%s' wants to make user '%s' join the session '%s'" % (
                g.get('users_name', None), item['user'], item['userservice_session']
            )
            _users = app.data.driver.db['user']
            user = _users.find_one({'_id': item['user']})
            if user:
                user_id = user['_id']
                user_name = user['name']
            else:  # pragma: no cover - probably unuseful ... Eve checks for existence !
                # User not found ...
                abort(_prepare_response(
                    'userservice_session_user',
                    {"_status": "KO", "content": "No user found with _id: %s." % item['user']},
                    status=412
                ))

        else:
            print "Current logged-in user '%s' wants to join the session '%s'" % (
                g.get('users_name', None), item['userservice_session']
            )
            item['user'] = g.get('users_id', None)
            user_id = g.get('users_id', None)
            user_name = g.get('users_name', None)

        # Check if user is already in the session
        print "----------"
        print "Check if user '%s' already joined the session '%s'" % (
            user_id, item['userservice_session']
        )
        _userservice_session_user = app.data.driver.db['userservice_session_user']
        userservice_session_user = _userservice_session_user.find_one({
            "$and": [{'userservice_session': item['userservice_session'], 'user': item['user']}]
        })
        print "userservice_session_user: %s" % (userservice_session_user)
        print "----------"
        if userservice_session_user:
            # Already joined ...
            abort(_prepare_response(
                'userservice_session_user',
                {
                    "_status": "KO",
                    "_id": "%s" % userservice_session_user['_id'],
                    "content": "The user %s (%s) already joined this session."
                               % (user_name, user_id)
                },
                status=412
            ))

        if item['status'] != 'open':
            # Only opening is possible ...
            abort(_prepare_response(
                'userservice_session_user',
                {
                    "_status": "KO",
                    "content": "You can only join the current session by "
                               "setting status='open' for this element."
                },
                status=412
            ))

        # Last ping if now!
        item['last_ping'] = datetime.utcnow()

        # Ok ... no tracking about this.
        del item['service_name']