def gen_facilities(db, nr_facilities: int = 30): uuids = [] for i in range(1, nr_facilities + 1): user = structure.user() apikey = utils.gen_api_key() changes = { "affiliation": "University " + random.choice(string.ascii_uppercase), "api_key": utils.gen_api_key_hash(apikey.key, apikey.salt), "api_salt": apikey.salt, "auth_ids": [f"facility{i}::local"], "email": f"facility{i}@domain{i}.se", "contact": f"pub_facility{i}@domain{i}.se", "name": f"Facility {i}", "permissions": ["DATA_EDIT"], "url": f"https://www.example.com/facility{i}", } user.update(changes) uuids.append(db["users"].insert_one(user).inserted_id) make_log( db, action="add", data=user, data_type="user", comment="Generated", user="******", ) return uuids
def get_user_data_structure(): """ Get an empty user entry. Returns: flask.Response: JSON structure of a user. """ empty_user = structure.user() empty_user["_id"] = "" return utils.response_json({"user": empty_user})
def get_user_data_structure(): """ Get an empty user entry. Returns: flask.Response: JSON structure with a list of users. """ empty_user = structure.user() empty_user['_id'] = '' return utils.response_json({'user': empty_user})
def add_user(): """ Add a user. Returns: flask.Response: Information about the user as json. """ perm_status = utils.req_check_permissions(["USER_ADD"]) if perm_status != 200: flask.abort(status=perm_status) new_user = structure.user() jsondata = flask.request.json if not jsondata.get("user") or not isinstance(jsondata["user"], dict): flask.abort(status=400) indata = jsondata["user"] validation = utils.basic_check_indata( indata, new_user, ("_id", "api_key", "api_salt", "auth_ids")) if not validation.result: flask.abort(status=validation.status) indata = utils.prepare_for_db(indata) if not indata: flask.abort(status=400) if "email" not in indata: flask.current_app.logger.debug("Email must be set") flask.abort(status=400) old_user = flask.g.db["users"].find_one({"email": indata["email"]}) if old_user: flask.current_app.logger.debug("User already exists") flask.abort(status=400) if not utils.req_has_permission( "USER_MANAGEMENT") and "permissions" in indata: flask.current_app.logger.debug( "USER_MANAGEMENT required for permissions") flask.abort(403) new_user.update(indata) new_user["auth_ids"] = [new_user["email"]] result = utils.req_commit_to_db("users", "add", new_user) if not result.log or not result.data: flask.abort(status=500) return utils.response_json({"_id": result.ins_id})
def add_new_user(user_info: dict): """ Add a new user to the database from first oidc login. First check if user with the same email exists. If so, add the auth_id to the user. Args: user_info (dict): Information about the user """ db_user = flask.g.db['users'].find_one({'email': user_info['email']}) if db_user: db_user['auth_ids'].append(user_info['auth_id']) result = flask.g.db['users'].update_one( {'email': user_info['email']}, {'$set': { 'auth_ids': db_user['auth_ids'] }}) if not result.acknowledged: flask.current_app.logger.error( 'Failed to add new auth_id to user with email %s', user_info['email']) flask.Response(status=500) else: utils.make_log('user', 'edit', 'Add OIDC entry to auth_ids', db_user, no_user=True) else: new_user = structure.user() new_user['email'] = user_info['email'] new_user['name'] = user_info['name'] new_user['auth_ids'] = [user_info['auth_id']] result = flask.g.db['users'].insert_one(new_user) if not result.acknowledged: flask.current_app.logger.error( 'Failed to add user with email %s via oidc', user_info['email']) flask.Response(status=500) else: utils.make_log('user', 'add', 'Creating new user from OAuth', new_user, no_user=True)
def add_new_user(user_info: dict): """ Add a new user to the database from first oidc login. First check if user with the same email exists. If so, add the auth_id to the user. Args: user_info (dict): Information about the user """ db_user = flask.g.db["users"].find_one({"email": user_info["email"]}) if db_user: db_user["auth_ids"].append(user_info["auth_id"]) result = flask.g.db["users"].update_one( {"email": user_info["email"]}, {"$set": { "auth_ids": db_user["auth_ids"] }}) if not result.acknowledged: flask.current_app.logger.error( "Failed to add new auth_id to user with email %s", user_info["email"]) flask.Response(status=500) else: utils.make_log("user", "edit", "Add OIDC entry to auth_ids", db_user, no_user=True) else: new_user = structure.user() new_user["email"] = user_info["email"] new_user["name"] = user_info["name"] new_user["auth_ids"] = [user_info["auth_id"]] result = flask.g.db["users"].insert_one(new_user) if not result.acknowledged: flask.current_app.logger.error( "Failed to add user with email %s via oidc", user_info["email"]) flask.Response(status=500) else: utils.make_log("user", "add", "Creating new user from OAuth", new_user, no_user=True)
def add_user(): """ Add a user. Returns: flask.Response: Information about the user as json. """ if not has_permission('USER_ADD'): flask.abort(403) new_user = structure.user() try: indata = flask.json.loads(flask.request.data) except json.decoder.JSONDecodeError: flask.abort(status=400) validation = utils.basic_check_indata( indata, new_user, ('_id', 'api_key', 'api_salt', 'auth_ids')) if not validation.result: flask.abort(status=validation.status) if 'email' not in indata: flask.current_app.logger.debug('Email must be set') flask.abort(status=400) old_user = flask.g.db['users'].find_one({'email': indata['email']}) if old_user: flask.current_app.logger.debug('User already exists') flask.abort(status=400) if not has_permission('USER_MANAGEMENT') and 'permissions' in indata: flask.current_app.logger.debug( 'USER_MANAGEMENT required for permissions') flask.abort(403) new_user.update(indata) new_user['auth_ids'] = [f'{new_user["_id"]}::local'] result = flask.g.db['users'].insert_one(new_user) if not result.acknowledged: flask.current_app.logger.error('User Addition failed: %s', new_user['email']) flask.Response(status=500) else: utils.make_log('user', 'add', 'User added by admin', new_user) return utils.response_json({'_id': result.inserted_id})
def add_default_user(db): """ Add a default user. User that will be added:: { 'name': 'Default User', 'email': '*****@*****.**', 'permissions': ['USER_MANAGEMENT'] } Api_key: 1234 Auth_id: default::default """ logging.info("Attempting to add default user") new_user = structure.user() api_salt = "fedcba09" new_user.update({ "name": "Default User", "email": "*****@*****.**", "permissions": ["USER_MANAGEMENT"], "api_key": utils.gen_api_key_hash("1234", api_salt), "api_salt": api_salt, "auth_ids": ["default::default"], }) result = db.users.insert_one(new_user) db["db_status"].update_one({"_id": "init_db"}, {"$set": { "user_added": True }}) if result.acknowledged: logging.info("Default user added") else: logging.error("Failed to add default user")
def gen_frontend_test_entries(db): apikey = {"salt": "abc", "key": "frontend"} apihash = utils.gen_api_key_hash(apikey["key"], apikey["salt"]) changes = [ { "_id": "u-4f2418f7-2609-43f1-8c7f-82c08e6daf26", "affiliation": "Frontend Test University", "api_key": apihash, "api_salt": apikey["salt"], "auth_ids": [f"author::frontend"], "email": f"*****@*****.**", "contact": f"*****@*****.**", "name": f"Frontend Author", "permissions": [], "url": "https://www.example.com/frontend_author", }, { "_id": "u-d54dc97d-ff9e-4e73-86bb-9c7a029e1b43", "affiliation": "Frontend Test University", "api_key": apihash, "api_salt": apikey["salt"], "auth_ids": [f"generator::frontend"], "email": f"*****@*****.**", "contact": f"*****@*****.**", "name": f"Frontend Generator", "permissions": ["DATA_EDIT"], "url": "https://www.example.com/frontend_generator", }, { "_id": "u-a5a7534b-1b49-41a5-b909-738e49cd137d", "affiliation": "Frontend Test University", "api_key": apihash, "api_salt": apikey["salt"], "auth_ids": [f"organisation::frontend"], "email": f"*****@*****.**", "contact": f"*****@*****.**", "name": f"Frontend Organisation", "permissions": ["DATA_MANAGEMENT", "USER_MANAGEMENT"], "url": "https://www.example.com/frontend_organisation", }, { "_id": "u-3a9a19a7-cd30-4c7b-b280-e35220e1a611", "affiliation": "Frontend Test University", "api_key": apihash, "api_salt": apikey["salt"], "auth_ids": [f"editor::frontend"], "email": f"*****@*****.**", "contact": f"*****@*****.**", "name": f"Frontend Editor", "permissions": ["DATA_EDIT"], "url": "https://www.example.com/frontend_editor", }, ] for entry in changes: user = structure.user() user.update(entry) db["users"].insert_one(user) make_log( db, action="add", data=user, data_type="user", comment="Generated", user="******", ) order = structure.order() changes = { "_id": "o-d4467732-8ddd-43a6-a904-5b7376f60e5c", "authors": ["u-4f2418f7-2609-43f1-8c7f-82c08e6daf26"], "generators": ["u-d54dc97d-ff9e-4e73-86bb-9c7a029e1b43"], "organisation": "u-a5a7534b-1b49-41a5-b909-738e49cd137d", "editors": ["u-3a9a19a7-cd30-4c7b-b280-e35220e1a611"], "description": "An order added for frontend tests", "title": f"Frontend Test Order", "properties": {"Type": "Frontend Test Entry"}, "tags": ["Frontend", "Test"], "datasets": ["d-79a755f1-69b0-4734-9977-ac945c4c51c1", "d-27cc1144-67bf-45b2-af21-425f9bfc7333"] } order.update(changes) db["orders"].insert_one(order) make_log( db, action="add", data=order, data_type="order", comment="Generated", user="******", ) dataset = structure.dataset() changes = { "_id": "d-79a755f1-69b0-4734-9977-ac945c4c51c1", "description": "A dataset added for frontend tests", "title": f"Frontend Test Dataset", "properties": {"Type": "Frontend Test Entry"}, "tags": ["Frontend", "Test"], } dataset.update(changes) db["datasets"].insert_one(dataset) make_log( db, action="add", data=dataset, data_type="dataset", comment="Generated", user="******", ) dataset = structure.dataset() changes = { "_id": "d-27cc1144-67bf-45b2-af21-425f9bfc7333", "description": "A dataset added for frontend tests 2", "title": f"Frontend Test Dataset 2", "properties": {"Type": "Frontend Test Entry"}, "tags": ["Frontend", "Test"], } dataset.update(changes) db["datasets"].insert_one(dataset) make_log( db, action="add", data=dataset, data_type="dataset", comment="Generated", user="******", ) collection = structure.collection() changes = { "_id": "c-21c8ecd1-9908-462f-ba84-3ca399074b36", "editors": ["u-3a9a19a7-cd30-4c7b-b280-e35220e1a611"], "description": "A collection added for frontend tests", "title": f"Frontend Test Collection", "properties": {"Type": "Frontend Test Entry"}, "tags": ["Frontend", "Test"], "datasets": ["d-79a755f1-69b0-4734-9977-ac945c4c51c1", "d-27cc1144-67bf-45b2-af21-425f9bfc7333"] } collection.update(changes) db["collections"].insert_one(collection) make_log( db, action="add", data=dataset, data_type="collection", comment="Generated", user="******", )
def gen_users(db, nr_users: int = 100): uuids = [] perm_keys = tuple(PERMISSIONS.keys()) # non-random users with specific rights special_users = [ {"name": "Base", "permissions": []}, {"name": "Edit", "permissions": ["DATA_EDIT"]}, {"name": "Owners", "permissions": ["OWNERS_READ"]}, {"name": "Users", "permissions": ["USER_MANAGEMENT"]}, {"name": "Data", "permissions": ["DATA_MANAGEMENT"]}, {"name": "Root", "permissions": list(perm_keys)}, ] for i, suser in enumerate(special_users): user = structure.user() user.update(suser) apikey = {"salt": "abc", "key": str(i)} user.update( { "affiliation": "Test University", "api_key": utils.gen_api_key_hash(apikey["key"], apikey["salt"]), "api_salt": apikey["salt"], "email": f'{"".join(user["name"].split())}@example.com', "contact": f'pub_{"".join(user["name"].split())}@example.com', "orcid": f"1111-1111-1111-111{i}", "auth_ids": [f'{user["name"].lower()}::testers'], "url": "https://www.example.com/specuser", } ) db["users"].insert_one(user) make_log( db, action="add", data=user, data_type="user", comment="Generated", user="******", ) for i in range(1, nr_users + 1): user = structure.user() apikey = utils.gen_api_key() changes = { "affiliation": "University " + random.choice(string.ascii_uppercase), "api_key": utils.gen_api_key_hash(apikey.key, apikey.salt), "api_salt": apikey.salt, "auth_ids": [f"user{i}::local"], "email": f"user{i}@place{i}.se", "contact": f"pub_user{i}@place{i}.se", "orcid": "-".join(f"{random.randint(0,10000):04}" for _ in range(4)), "name": f"First Last {i}", "permissions": list( set(random.choice(perm_keys) for _ in range(random.randint(0, 2))) ), "url": f"https://www.example.com/user{i}", } user.update(changes) uuids.append(db["users"].insert_one(user).inserted_id) make_log( db, action="add", data=user, data_type="user", comment="Generated", user="******", ) return uuids