From b07b6a6579b85bb1ddbfba32d09eca97aaf95fae Mon Sep 17 00:00:00 2001
From: tobias <thinkdifferent055@gmail.com>
Date: Thu, 15 Oct 2020 16:26:45 +0200
Subject: [PATCH] Add UsernamePasswordService, SessionLoginWrapper

---
 .gitignore                                      |  3 ++-
 .../auth/SessionLoginWrapper.py                 | 15 +++++++++++++++
 .../auth/UsernamePasswordService.py             | 17 +++++++++++++++++
 TheCodeLabs_FlaskUtils/setup.py                 |  1 +
 4 files changed, 35 insertions(+), 1 deletion(-)
 create mode 100644 TheCodeLabs_FlaskUtils/TheCodeLabs_FlaskUtils/auth/SessionLoginWrapper.py
 create mode 100644 TheCodeLabs_FlaskUtils/TheCodeLabs_FlaskUtils/auth/UsernamePasswordService.py

diff --git a/.gitignore b/.gitignore
index dc11f6c..fe69370 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,4 +2,5 @@ dist/
 MANIFEST
 build/
 *.egg-info/
-*.eggs/
\ No newline at end of file
+*.eggs/
+venv/
\ No newline at end of file
diff --git a/TheCodeLabs_FlaskUtils/TheCodeLabs_FlaskUtils/auth/SessionLoginWrapper.py b/TheCodeLabs_FlaskUtils/TheCodeLabs_FlaskUtils/auth/SessionLoginWrapper.py
new file mode 100644
index 0000000..8a92dc9
--- /dev/null
+++ b/TheCodeLabs_FlaskUtils/TheCodeLabs_FlaskUtils/auth/SessionLoginWrapper.py
@@ -0,0 +1,15 @@
+from functools import wraps
+
+from flask import session, redirect, url_for
+
+
+def require_login(func):
+    @wraps(func)
+    def check_token(*args, **kwargs):
+        if 'authorized' not in session:
+            return redirect(url_for('authentication.login'))
+
+        # redirect to requested url
+        return func(*args, **kwargs)
+
+    return check_token
diff --git a/TheCodeLabs_FlaskUtils/TheCodeLabs_FlaskUtils/auth/UsernamePasswordService.py b/TheCodeLabs_FlaskUtils/TheCodeLabs_FlaskUtils/auth/UsernamePasswordService.py
new file mode 100644
index 0000000..93f5787
--- /dev/null
+++ b/TheCodeLabs_FlaskUtils/TheCodeLabs_FlaskUtils/auth/UsernamePasswordService.py
@@ -0,0 +1,17 @@
+import bcrypt
+
+
+class UserService:
+    def __init__(self, users):
+        self.__users = {}
+        for user in users:
+            self.__users[user["name"].lower()] = user["password"]
+
+    def get_users(self):
+        return self.__users
+
+    def is_password_valid(self, name: str, password: str) -> bool:
+        saved_password = self.__users.get(name.lower(), None)
+        if saved_password is None:
+            raise ValueError(f'User {name} not found')
+        return bcrypt.checkpw(password.encode(), saved_password.encode())
diff --git a/TheCodeLabs_FlaskUtils/setup.py b/TheCodeLabs_FlaskUtils/setup.py
index a4c021d..f94711b 100644
--- a/TheCodeLabs_FlaskUtils/setup.py
+++ b/TheCodeLabs_FlaskUtils/setup.py
@@ -14,6 +14,7 @@ setup(
     install_requires=[
         'flask',
         'gevent'
+        'bcrypt'
     ],
     setup_requires=[
         'wheel'
-- 
GitLab