|
|
import bcrypt |
|
|
from database import AttendanceDatabase |
|
|
from typing import Optional |
|
|
|
|
|
class AuthManager: |
|
|
def __init__(self, db: AttendanceDatabase): |
|
|
"""Initialize the authentication manager with database connection.""" |
|
|
self.db = db |
|
|
self.default_password = "1122" |
|
|
self._ensure_default_password() |
|
|
|
|
|
def _ensure_default_password(self): |
|
|
"""Ensure the default password is set in the database.""" |
|
|
stored_password_hash = self.db.get_setting("admin_password_hash") |
|
|
if not stored_password_hash: |
|
|
|
|
|
default_hash = self.hash_password(self.default_password) |
|
|
self.db.set_setting("admin_password_hash", default_hash) |
|
|
|
|
|
def hash_password(self, password: str) -> str: |
|
|
"""Hash a password using bcrypt.""" |
|
|
salt = bcrypt.gensalt() |
|
|
hashed = bcrypt.hashpw(password.encode('utf-8'), salt) |
|
|
return hashed.decode('utf-8') |
|
|
|
|
|
def verify_password(self, password: str, hashed_password: str) -> bool: |
|
|
"""Verify a password against its hash.""" |
|
|
try: |
|
|
return bcrypt.checkpw(password.encode('utf-8'), hashed_password.encode('utf-8')) |
|
|
except Exception as e: |
|
|
print(f"Error verifying password: {e}") |
|
|
return False |
|
|
|
|
|
def authenticate_admin(self, password: str) -> bool: |
|
|
"""Authenticate admin password for employee management operations.""" |
|
|
stored_password_hash = self.db.get_setting("admin_password_hash") |
|
|
if not stored_password_hash: |
|
|
|
|
|
return password == self.default_password |
|
|
|
|
|
return self.verify_password(password, stored_password_hash) |
|
|
|
|
|
def change_admin_password(self, current_password: str, new_password: str) -> bool: |
|
|
"""Change the admin password.""" |
|
|
if not self.authenticate_admin(current_password): |
|
|
return False |
|
|
|
|
|
new_hash = self.hash_password(new_password) |
|
|
return self.db.set_setting("admin_password_hash", new_hash) |
|
|
|
|
|
def get_current_admin_password_hint(self) -> str: |
|
|
"""Get a hint about the current admin password (for development/testing).""" |
|
|
stored_password_hash = self.db.get_setting("admin_password_hash") |
|
|
if not stored_password_hash: |
|
|
return "Default password: 1122" |
|
|
else: |
|
|
return "Custom password set" |
|
|
|
|
|
if __name__ == "__main__": |
|
|
|
|
|
from database import AttendanceDatabase |
|
|
|
|
|
db = AttendanceDatabase() |
|
|
auth = AuthManager(db) |
|
|
|
|
|
|
|
|
print("Testing default password '1122':", auth.authenticate_admin("1122")) |
|
|
print("Testing wrong password 'wrong':", auth.authenticate_admin("wrong")) |
|
|
|
|
|
|
|
|
print("Changing password from '1122' to 'newpass':", auth.change_admin_password("1122", "newpass")) |
|
|
print("Testing old password '1122':", auth.authenticate_admin("1122")) |
|
|
print("Testing new password 'newpass':", auth.authenticate_admin("newpass")) |
|
|
|
|
|
|
|
|
print("Changing back to default:", auth.change_admin_password("newpass", "1122")) |
|
|
print("Testing default password again:", auth.authenticate_admin("1122")) |
|
|
|
|
|
|