Spaces:
Runtime error
Runtime error
Committing the work
Browse files- src/auth.py +20 -0
- src/routers/admin.py +3 -3
- src/routers/clearance.py +4 -4
- src/routers/token.py +1 -1
- src/routers/users.py +3 -3
src/auth.py
CHANGED
|
@@ -100,6 +100,26 @@ async def get_verified_device(
|
|
| 100 |
raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="Device is not active.")
|
| 101 |
return device_orm
|
| 102 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 103 |
# Tag-based authentication (User/Student Authentication via RFID tag)
|
| 104 |
async def authenticate_tag_user_or_student( # Renamed for clarity
|
| 105 |
tag_id: str = Header(..., alias="X-User-Tag-ID", description="RFID Tag ID of the user or student"),
|
|
|
|
| 100 |
raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="Device is not active.")
|
| 101 |
return device_orm
|
| 102 |
|
| 103 |
+
|
| 104 |
+
async def authenticate_user(
|
| 105 |
+
username: str,
|
| 106 |
+
password: str,
|
| 107 |
+
db: SQLAlchemySessionType = Depends(get_db)
|
| 108 |
+
) -> models.User: # Returns ORM User model
|
| 109 |
+
"""
|
| 110 |
+
Authenticates a user by username and password.
|
| 111 |
+
Returns the ORM User model if successful, raises HTTPException otherwise.
|
| 112 |
+
"""
|
| 113 |
+
user_orm = await run_in_threadpool(crud.get_user_by_username, db, username)
|
| 114 |
+
|
| 115 |
+
if not user_orm or not user_orm.is_active:
|
| 116 |
+
raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid credentials or inactive user.")
|
| 117 |
+
|
| 118 |
+
if not crud.verify_password(password, user_orm.hashed_password):
|
| 119 |
+
raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Incorrect password.")
|
| 120 |
+
|
| 121 |
+
return user_orm # Return the ORM User model
|
| 122 |
+
|
| 123 |
# Tag-based authentication (User/Student Authentication via RFID tag)
|
| 124 |
async def authenticate_tag_user_or_student( # Renamed for clarity
|
| 125 |
tag_id: str = Header(..., alias="X-User-Tag-ID", description="RFID Tag ID of the user or student"),
|
src/routers/admin.py
CHANGED
|
@@ -8,13 +8,13 @@ from sqlalchemy.orm import Session
|
|
| 8 |
from datetime import datetime, timedelta
|
| 9 |
|
| 10 |
from src import crud, models
|
| 11 |
-
from src.auth import
|
| 12 |
from src.database import get_db
|
| 13 |
|
| 14 |
router = APIRouter(
|
| 15 |
prefix="/api/admin",
|
| 16 |
tags=["Admin"],
|
| 17 |
-
dependencies=[Depends(
|
| 18 |
)
|
| 19 |
|
| 20 |
@router.post("/prepare-tag-link", status_code=status.HTTP_202_ACCEPTED, response_model=dict)
|
|
@@ -57,7 +57,7 @@ async def prepare_device_for_tag_linking(
|
|
| 57 |
async def delete_user_endpoint(
|
| 58 |
username: str,
|
| 59 |
db: Session = Depends(get_db),
|
| 60 |
-
current_admin: models.User = Depends(
|
| 61 |
):
|
| 62 |
"""
|
| 63 |
Admin: Permanently deletes a user (staff or other admin).
|
|
|
|
| 8 |
from datetime import datetime, timedelta
|
| 9 |
|
| 10 |
from src import crud, models
|
| 11 |
+
from src.auth import get_current_active_admin_user_from_token, get_current_active_user
|
| 12 |
from src.database import get_db
|
| 13 |
|
| 14 |
router = APIRouter(
|
| 15 |
prefix="/api/admin",
|
| 16 |
tags=["Admin"],
|
| 17 |
+
dependencies=[Depends(get_current_active_admin_user_from_token)]
|
| 18 |
)
|
| 19 |
|
| 20 |
@router.post("/prepare-tag-link", status_code=status.HTTP_202_ACCEPTED, response_model=dict)
|
|
|
|
| 57 |
async def delete_user_endpoint(
|
| 58 |
username: str,
|
| 59 |
db: Session = Depends(get_db),
|
| 60 |
+
current_admin: models.User = Depends(get_current_active_admin_user_from_token)
|
| 61 |
):
|
| 62 |
"""
|
| 63 |
Admin: Permanently deletes a user (staff or other admin).
|
src/routers/clearance.py
CHANGED
|
@@ -7,13 +7,13 @@ from fastapi.concurrency import run_in_threadpool
|
|
| 7 |
|
| 8 |
from src import crud, models
|
| 9 |
from src.database import get_db
|
| 10 |
-
from src.auth import
|
| 11 |
from src.utils import format_student_clearance_details
|
| 12 |
|
| 13 |
router = APIRouter(
|
| 14 |
prefix="/api/clearance",
|
| 15 |
tags=["Clearance"],
|
| 16 |
-
dependencies=[Depends(
|
| 17 |
)
|
| 18 |
|
| 19 |
class ClearanceUpdatePayload(models.BaseModel):
|
|
@@ -25,7 +25,7 @@ async def update_student_clearance(
|
|
| 25 |
student_id_str: str,
|
| 26 |
payload: ClearanceUpdatePayload,
|
| 27 |
db: Session = Depends(get_db),
|
| 28 |
-
current_user: models.User = Depends(
|
| 29 |
):
|
| 30 |
"""
|
| 31 |
Staff/Admin: Update a student's clearance status for their department.
|
|
@@ -45,7 +45,7 @@ async def reset_student_clearance(
|
|
| 45 |
student_id_str: str,
|
| 46 |
department_str: str,
|
| 47 |
db: Session = Depends(get_db),
|
| 48 |
-
current_user: models.User = Depends(
|
| 49 |
):
|
| 50 |
"""
|
| 51 |
Staff/Admin: Reset a student's clearance status for a department.
|
|
|
|
| 7 |
|
| 8 |
from src import crud, models
|
| 9 |
from src.database import get_db
|
| 10 |
+
from src.auth import get_current_active_user, get_current_active_staff_user_from_token
|
| 11 |
from src.utils import format_student_clearance_details
|
| 12 |
|
| 13 |
router = APIRouter(
|
| 14 |
prefix="/api/clearance",
|
| 15 |
tags=["Clearance"],
|
| 16 |
+
dependencies=[Depends(get_current_active_staff_user_from_token)]
|
| 17 |
)
|
| 18 |
|
| 19 |
class ClearanceUpdatePayload(models.BaseModel):
|
|
|
|
| 25 |
student_id_str: str,
|
| 26 |
payload: ClearanceUpdatePayload,
|
| 27 |
db: Session = Depends(get_db),
|
| 28 |
+
current_user: models.User = Depends(get_current_active_staff_user_from_token)
|
| 29 |
):
|
| 30 |
"""
|
| 31 |
Staff/Admin: Update a student's clearance status for their department.
|
|
|
|
| 45 |
student_id_str: str,
|
| 46 |
department_str: str,
|
| 47 |
db: Session = Depends(get_db),
|
| 48 |
+
current_user: models.User = Depends(get_current_active_staff_user_from_token)
|
| 49 |
):
|
| 50 |
"""
|
| 51 |
Staff/Admin: Reset a student's clearance status for a department.
|
src/routers/token.py
CHANGED
|
@@ -8,7 +8,7 @@ from datetime import timedelta
|
|
| 8 |
|
| 9 |
from src import models
|
| 10 |
from src.database import get_db
|
| 11 |
-
from src.auth import
|
| 12 |
from src.config import settings
|
| 13 |
|
| 14 |
router = APIRouter(
|
|
|
|
| 8 |
|
| 9 |
from src import models
|
| 10 |
from src.database import get_db
|
| 11 |
+
from src.auth import create_access_token, authenticate_tag_user_or_student as authenticate_user
|
| 12 |
from src.config import settings
|
| 13 |
|
| 14 |
router = APIRouter(
|
src/routers/users.py
CHANGED
|
@@ -7,14 +7,14 @@ from typing import List
|
|
| 7 |
|
| 8 |
from src import crud, models
|
| 9 |
from src.database import get_db
|
| 10 |
-
from src.auth import get_current_active_user,
|
| 11 |
|
| 12 |
router = APIRouter(
|
| 13 |
prefix="/api/users",
|
| 14 |
tags=["Users"],
|
| 15 |
)
|
| 16 |
|
| 17 |
-
@router.post("/", response_model=models.UserResponse, status_code=status.HTTP_201_CREATED, dependencies=[Depends(
|
| 18 |
async def create_new_user(user: models.UserCreate, db: Session = Depends(get_db)):
|
| 19 |
"""
|
| 20 |
Admin: Create a new user (staff or admin).
|
|
@@ -24,7 +24,7 @@ async def create_new_user(user: models.UserCreate, db: Session = Depends(get_db)
|
|
| 24 |
except HTTPException as e:
|
| 25 |
raise e
|
| 26 |
|
| 27 |
-
@router.get("/", response_model=List[models.UserResponse], dependencies=[Depends(
|
| 28 |
async def read_users(skip: int = 0, limit: int = 100, db: Session = Depends(get_db)):
|
| 29 |
"""
|
| 30 |
Admin: Retrieve a list of all users.
|
|
|
|
| 7 |
|
| 8 |
from src import crud, models
|
| 9 |
from src.database import get_db
|
| 10 |
+
from src.auth import get_current_active_user, get_current_active_admin_user_from_token
|
| 11 |
|
| 12 |
router = APIRouter(
|
| 13 |
prefix="/api/users",
|
| 14 |
tags=["Users"],
|
| 15 |
)
|
| 16 |
|
| 17 |
+
@router.post("/", response_model=models.UserResponse, status_code=status.HTTP_201_CREATED, dependencies=[Depends(get_current_active_admin_user_from_token)])
|
| 18 |
async def create_new_user(user: models.UserCreate, db: Session = Depends(get_db)):
|
| 19 |
"""
|
| 20 |
Admin: Create a new user (staff or admin).
|
|
|
|
| 24 |
except HTTPException as e:
|
| 25 |
raise e
|
| 26 |
|
| 27 |
+
@router.get("/", response_model=List[models.UserResponse], dependencies=[Depends(get_current_active_admin_user_from_token)])
|
| 28 |
async def read_users(skip: int = 0, limit: int = 100, db: Session = Depends(get_db)):
|
| 29 |
"""
|
| 30 |
Admin: Retrieve a list of all users.
|