diff options
author | Frederick Muriuki Muriithi | 2023-01-05 07:53:21 +0300 |
---|---|---|
committer | Frederick Muriuki Muriithi | 2023-01-05 07:53:21 +0300 |
commit | 93e20e7be957c0a4c8b08d2a5395f29109865c82 (patch) | |
tree | 8c527e968eef756671bffdfe0e2b119eb6042158 /gn3/auth/authorisation | |
parent | 3752c663fa9ded1801680aa2342947b7676d8ce9 (diff) | |
download | genenetwork3-93e20e7be957c0a4c8b08d2a5395f29109865c82.tar.gz |
auth: Persist the user's registration details
If the registration details pass the validations steps, then persist the
details in the database and respond with details about the newly created user.
* gn3/auth/authentication/users.py: new functions
* `save_user`: create and persist a new user
* `set_user_password`: hash and persist the new password for the given user
* gn3/auth/authorisation/views.py: Persist the user details and respond with
the newly persisted user details.
Diffstat (limited to 'gn3/auth/authorisation')
-rw-r--r-- | gn3/auth/authorisation/views.py | 38 |
1 files changed, 29 insertions, 9 deletions
diff --git a/gn3/auth/authorisation/views.py b/gn3/auth/authorisation/views.py index 73d39d2..6ac3be0 100644 --- a/gn3/auth/authorisation/views.py +++ b/gn3/auth/authorisation/views.py @@ -8,7 +8,9 @@ from gn3.auth.blueprint import oauth2 from .groups import user_group from .errors import UserRegistrationError from .roles import user_roles as _user_roles + from ..authentication.oauth2.resource_server import require_oauth +from ..authentication.users import User, save_user, set_user_password from ..authentication.oauth2.models.oauth2token import token_by_access_token @oauth2.route("/user", methods=["GET"]) @@ -41,6 +43,8 @@ def __email_valid__(email: str) -> Tuple[bool, Optional[str]]: return False, "Empty email address" ## Check that the address is a valid email address + ## Review use of `email-validator` or `pyIsEmail` python packages for + ## validating the emails, if it turns out this is important. ## Success return True, None @@ -54,6 +58,12 @@ def __password_valid__(password, confirm_password) -> Tuple[bool, Optional[str]] return True, None +def __user_name_valid__(name: str) -> Tuple[bool, Optional[str]]: + if name == "": + return False, "User's name not provided." + + return True, None + def __assert_not_logged_in__(conn: db.DbConnection): bearer = request.headers.get('Authorization') if bearer: @@ -70,17 +80,27 @@ def register_user(): __assert_not_logged_in__(conn) form = request.form + email = form.get("email", "") + password = form.get("password", "") + user_name = form.get("user_name", "") errors = tuple( error[1] for error in - [__email_valid__(form.get("email", "")), - __password_valid__(form.get("password", ""), - form.get("confirm_password", ""))] + [__email_valid__(email), + __password_valid__(password, form.get("confirm_password", "")), + __user_name_valid__(user_name)] if error[0]) if len(errors) > 0: raise UserRegistrationError(*errors) - # Provide default privileges - return jsonify( - { - "error": "not_implemented", - "error_description": "Feature not implemented" - }), 500 + + with db.cursor(conn) as cursor: + user, _hashed_password = set_user_password( + cursor, save_user(cursor, email, user_name), password) + return jsonify( + { + "user_id": user.user_id, + "email": user.email, + "name": user.name + }), 200 + + raise Exception( + "unknown_error", "The system experienced an unexpected error.") |