aboutsummaryrefslogtreecommitdiff
path: root/gn3/auth/authentication
diff options
context:
space:
mode:
Diffstat (limited to 'gn3/auth/authentication')
-rw-r--r--gn3/auth/authentication/__init__.py24
-rw-r--r--gn3/auth/authentication/users.py9
2 files changed, 33 insertions, 0 deletions
diff --git a/gn3/auth/authentication/__init__.py b/gn3/auth/authentication/__init__.py
new file mode 100644
index 0000000..42ceacb
--- /dev/null
+++ b/gn3/auth/authentication/__init__.py
@@ -0,0 +1,24 @@
+"""Handle authentication requests"""
+
+import bcrypt
+
+def credentials_in_database(cursor, email: str, password: str) -> bool:
+ """Check whether credentials are in the database."""
+ if len(email.strip()) == 0 or len(password.strip()) == 0:
+ return False
+
+ cursor.execute(
+ ("SELECT "
+ "users.email, user_credentials.password "
+ "FROM users LEFT JOIN user_credentials "
+ "ON users.user_id = user_credentials.user_id "
+ "WHERE users.email = :email"),
+ {"email": email})
+ results = cursor.fetchall()
+ if len(results) == 0:
+ return False
+
+ assert len(results) == 1, "Expected one row."
+ row = results[0]
+ return (email == row[0] and
+ bcrypt.checkpw(password.encode("utf-8"), row[1]))
diff --git a/gn3/auth/authentication/users.py b/gn3/auth/authentication/users.py
new file mode 100644
index 0000000..4854d18
--- /dev/null
+++ b/gn3/auth/authentication/users.py
@@ -0,0 +1,9 @@
+"""User-specific code and data structures."""
+from uuid import UUID
+from typing import NamedTuple
+
+class User(NamedTuple):
+ """Class representing a user."""
+ user_id: UUID
+ email: str
+ name: str