1
-
1
+ from datetime import datetime
2
2
from flask import render_template , request , redirect , url_for , Blueprint , flash
3
3
4
- from flask_login import login_user , logout_user
4
+ from flask_login import login_user , logout_user , current_user , login_required
5
5
6
6
from src .config import app , db , bcrypt , login_manager
7
7
from src .models import User , log_action , Settings
@@ -19,9 +19,11 @@ def register():
19
19
# Check if this is the first user
20
20
if User .query .count () == 0 :
21
21
user_level = 'admin' # Make the first user an admin
22
+ password_changed = False
22
23
else :
23
24
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 )
25
27
db .session .add (user )
26
28
db .session .commit ()
27
29
return redirect (url_for ('auth.login' ))
@@ -37,12 +39,46 @@ def login():
37
39
if user and bcrypt .check_password_hash (user .password , password ):
38
40
login_user (user )
39
41
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
+
40
48
flash (f'Login successful as { user .username } ' , 'success' )
41
49
return redirect (url_for ('admin.dashboard' ))
42
50
else :
43
51
flash ('Login failed. Please check your credentials.' , 'danger' )
44
52
return render_template ('login.html' , settings = system_settings )
45
53
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
+
46
82
@auth_bp .route ("/logout" )
47
83
def logout ():
48
84
logout_user ()
0 commit comments