added login cookie, added change pwd screen
This commit is contained in:
@@ -1,14 +1,82 @@
|
||||
from flask import Blueprint, render_template, request, redirect, url_for, flash
|
||||
from flask import Blueprint, render_template, request, redirect, url_for, flash, make_response
|
||||
from flask_login import login_user, logout_user, login_required, current_user
|
||||
from models import db
|
||||
from models import User
|
||||
from log import Log
|
||||
import pickle
|
||||
from cryptography.fernet import Fernet
|
||||
import datetime
|
||||
|
||||
|
||||
auth_bp = Blueprint("auth", __name__)
|
||||
|
||||
# =====================================================
|
||||
# SECRET KEY (only your program has this)
|
||||
# =====================================================
|
||||
# Generate once using: Fernet.generate_key()
|
||||
_SECRET_KEY = b'YFK7QCyTzhyLO4vqrnRxvDAI5uu8mXEYrInEjbRoQgs='
|
||||
|
||||
fernet = Fernet(_SECRET_KEY)
|
||||
|
||||
# =====================================================
|
||||
# ENCRYPT
|
||||
# =====================================================
|
||||
def encrypt_object(obj) -> bytes:
|
||||
"""
|
||||
Encrypt any Python object and return encrypted bytes.
|
||||
"""
|
||||
serialized = pickle.dumps(obj)
|
||||
encrypted = fernet.encrypt(serialized)
|
||||
return encrypted
|
||||
|
||||
# =====================================================
|
||||
# DECRYPT
|
||||
# =====================================================
|
||||
def decrypt_object(encrypted_data: bytes):
|
||||
"""
|
||||
Decrypt bytes back into the original Python object.
|
||||
"""
|
||||
decrypted = fernet.decrypt(encrypted_data)
|
||||
obj = pickle.loads(decrypted)
|
||||
return obj
|
||||
|
||||
def create_cookie(userid):
|
||||
cookie_data = {
|
||||
"user": userid,
|
||||
"datetime": datetime.datetime.now()
|
||||
}
|
||||
return encrypt_object(cookie_data).decode('utf-8')
|
||||
|
||||
def is_cookie_ok_to_autologin(cookie_content):
|
||||
user = 0
|
||||
autologin = False
|
||||
try:
|
||||
cookie_data = decrypt_object(cookie_content)
|
||||
user = cookie_data["user"]
|
||||
dt = cookie_data["datetime"]
|
||||
lastweek = datetime.datetime.now() - datetime.timedelta(days=7)
|
||||
autologin = dt > lastweek
|
||||
except:
|
||||
Log.info("Cookie error")
|
||||
if autologin:
|
||||
return user
|
||||
return 0
|
||||
|
||||
|
||||
|
||||
|
||||
#. @auth_bp.route("/", methods=["GET", "POST"])
|
||||
@auth_bp.route("/login", methods=["GET", "POST"])
|
||||
def login():
|
||||
username = request.cookies.get('username')
|
||||
|
||||
userid = is_cookie_ok_to_autologin(username)
|
||||
if userid>0:
|
||||
user = User.query.filter_by(id=userid).first()
|
||||
if user and user.is_approved:
|
||||
login_user(user)
|
||||
return redirect(url_for("lists.home"))
|
||||
|
||||
if request.method == "POST":
|
||||
user = User.query.filter_by(name=request.form["name"]).first()
|
||||
if user and user.check_password(request.form["password"]):
|
||||
@@ -18,7 +86,12 @@ def login():
|
||||
return redirect(url_for("lists.home"))
|
||||
flash("Invalid credentials")
|
||||
Log.info(f"Authorization failure for user '{request.form["name"]}' ")
|
||||
return render_template("login.html")
|
||||
|
||||
|
||||
resp = make_response(render_template("login.html"))
|
||||
resp.set_cookie('username', '')
|
||||
return resp
|
||||
|
||||
|
||||
@auth_bp.route("/register", methods=["GET", "POST"])
|
||||
def register():
|
||||
@@ -34,5 +107,27 @@ def register():
|
||||
@login_required
|
||||
def logout():
|
||||
logout_user()
|
||||
return redirect(url_for("auth.login"))
|
||||
resp = make_response(redirect(url_for("auth.login")))
|
||||
resp.set_cookie('username', '')
|
||||
return resp
|
||||
|
||||
|
||||
@auth_bp.route("/change_pwd", methods=["GET", "POST"])
|
||||
def change_pwd():
|
||||
if request.method == "POST":
|
||||
pwd_old = request.form["password_old"]
|
||||
pwd_new1 = request.form["password_new1"]
|
||||
pwd_new2 = request.form["password_new2"]
|
||||
print(f" >>{pwd_old} {pwd_new1} {pwd_new2}")
|
||||
print(f"cp: {current_user.name}")
|
||||
if current_user.check_password(pwd_old):
|
||||
if pwd_new1 == pwd_new2:
|
||||
current_user.set_password(pwd_new2)
|
||||
db.session.commit()
|
||||
return redirect(url_for("lists.home"))
|
||||
flash("New Passwords are not identical")
|
||||
flash("Invalid credentials")
|
||||
Log.info(f"Authorization failure for user '{request.form["name"]}' ")
|
||||
|
||||
return render_template(url_for("lists.home"))
|
||||
return render_template("change_pwd.html")
|
||||
Reference in New Issue
Block a user