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
Exemplo n.º 2
0
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})
Exemplo n.º 3
0
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})
Exemplo n.º 4
0
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})
Exemplo n.º 5
0
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)
Exemplo n.º 6
0
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)
Exemplo n.º 7
0
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