| 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")) |
|
|
|
|