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