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.
|