aboutsummaryrefslogtreecommitdiff
path: root/gn3/auth/authentication/users.py
diff options
context:
space:
mode:
authorFrederick Muriuki Muriithi2023-01-05 07:53:21 +0300
committerFrederick Muriuki Muriithi2023-01-05 07:53:21 +0300
commit93e20e7be957c0a4c8b08d2a5395f29109865c82 (patch)
tree8c527e968eef756671bffdfe0e2b119eb6042158 /gn3/auth/authentication/users.py
parent3752c663fa9ded1801680aa2342947b7676d8ce9 (diff)
downloadgenenetwork3-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/authentication/users.py')
-rw-r--r--gn3/auth/authentication/users.py26
1 files changed, 25 insertions, 1 deletions
diff --git a/gn3/auth/authentication/users.py b/gn3/auth/authentication/users.py
index 6ec6bca..0cd5852 100644
--- a/gn3/auth/authentication/users.py
+++ b/gn3/auth/authentication/users.py
@@ -1,5 +1,5 @@
"""User-specific code and data structures."""
-from uuid import UUID
+from uuid import UUID, uuid4
from typing import NamedTuple
import bcrypt
@@ -53,3 +53,27 @@ def valid_login(conn: db.DbConnection, user: User, password: str) -> bool:
return False
return bcrypt.checkpw(password.encode("utf-8"), row["password"])
+
+def save_user(cursor: db.DbCursor, email: str, name: str) -> User:
+ """
+ Create and persist a user.
+
+ The user creation could be done during a transaction, therefore the function
+ takes a cursor object rather than a connection.
+
+ The newly created and persisted user is then returned.
+ """
+ user_id = uuid4()
+ cursor.execute("INSERT INTO users VALUES (?, ?, ?)",
+ (str(user_id), email, name))
+ return User(user_id, email, name)
+
+def set_user_password(
+ cursor: db.DbCursor, user: User, password: str) -> Tuple[User, bytes]:
+ """Set the given user's password in the database."""
+ hashed_password = bcrypt.hashpw(password.encode("utf8"), bcrypt.gensalt())
+ cursor.execute(
+ ("INSERT INTO user_credentials VALUES (:user_id, :hash) "
+ "ON CONFLICT (user_id) DO UPDATE SET password=:hash"),
+ {"user_id": str(user.user_id), "hash": hashed_password})
+ return user, hashed_password