1-
1+ from datetime import datetime
22from flask import render_template , request , redirect , url_for , Blueprint , flash
33
4- from flask_login import login_user , logout_user
4+ from flask_login import login_user , logout_user , current_user , login_required
55
66from src .config import app , db , bcrypt , login_manager
77from src .models import User , log_action , Settings
@@ -19,9 +19,11 @@ def register():
1919 # Check if this is the first user
2020 if User .query .count () == 0 :
2121 user_level = 'admin' # Make the first user an admin
22+ password_changed = False
2223 else :
2324 user_level = 'customer' # Default to 'customer' for all other users
24- user = User (fname = fname , lname = lname , username = username , email = email , password = password , user_level = user_level )
25+ password_changed = True
26+ user = User (fname = fname , lname = lname , username = username , email = email , password = password , user_level = user_level , password_changed = password_changed )
2527 db .session .add (user )
2628 db .session .commit ()
2729 return redirect (url_for ('auth.login' ))
@@ -37,12 +39,46 @@ def login():
3739 if user and bcrypt .check_password_hash (user .password , password ):
3840 login_user (user )
3941 log_action (user .id , user .username , 'Login' , f'User { user .username } logged in.' )
42+
43+ # Check if the admin needs to change their password
44+ if user .user_level == 'admin' and not user .password_changed :
45+ flash ('You need to change your password first to continue.' , 'warning' )
46+ return redirect (url_for ('auth.change_password' ))
47+
4048 flash (f'Login successful as { user .username } ' , 'success' )
4149 return redirect (url_for ('admin.dashboard' ))
4250 else :
4351 flash ('Login failed. Please check your credentials.' , 'danger' )
4452 return render_template ('login.html' , settings = system_settings )
4553
54+ @auth_bp .route ("/change-password" , methods = ['GET' , 'POST' ])
55+ @login_required
56+ def change_password ():
57+ system_settings = Settings .query .first ()
58+ if request .method == 'POST' :
59+ current_password = request .form .get ('current_password' )
60+ new_password = request .form .get ('new_password' )
61+ user = User .query .get (current_user .id )
62+
63+ if user and bcrypt .check_password_hash (user .password , current_password ):
64+ user .password = bcrypt .generate_password_hash (new_password ).decode ('utf-8' )
65+ user .password_changed = True # Set the flag to True
66+ user .last_password_change = datetime .utcnow ()
67+ db .session .commit ()
68+ flash ('Password updated successfully!' , 'success' )
69+
70+ return redirect (url_for ('auth.change_password' ))
71+ else :
72+ flash ('Current password is incorrect.' , 'danger' )
73+
74+ # if current user password_changed false, flash a message
75+ if not current_user .password_changed :
76+ flash ('You need to change your password first to continue.' , 'warning' )
77+ return render_template ('change_password.html' , settings = system_settings )
78+
79+ return render_template ('change_password.html' , settings = system_settings )
80+
81+
4682@auth_bp .route ("/logout" )
4783def logout ():
4884 logout_user ()
0 commit comments