chore: standardize security and quality foundations
This commit is contained in:
@@ -60,6 +60,15 @@ from ..auth import (
|
||||
set_auth_cookies,
|
||||
)
|
||||
from ..config import settings
|
||||
from ..api_models import (
|
||||
COMMON_ERROR_RESPONSES,
|
||||
ChangePasswordRequest,
|
||||
ForgotPasswordRequest,
|
||||
PasswordResetRequest,
|
||||
ProfileEmailUpdateRequest,
|
||||
SignupRequest,
|
||||
request_data,
|
||||
)
|
||||
from ..network_security import request_trusts_forwarded_headers
|
||||
from ..services.user_cache import (
|
||||
build_jellyseerr_candidate_map,
|
||||
@@ -81,7 +90,7 @@ from ..services.password_reset import (
|
||||
verify_password_reset_token,
|
||||
)
|
||||
|
||||
router = APIRouter(prefix="/auth", tags=["auth"])
|
||||
router = APIRouter(prefix="/auth", tags=["auth"], responses=COMMON_ERROR_RESPONSES)
|
||||
logger = logging.getLogger(__name__)
|
||||
SELF_SERVICE_INVITE_MASTER_ID_KEY = "self_service_invite_master_id"
|
||||
STREAM_TOKEN_TTL_SECONDS = 120
|
||||
@@ -869,7 +878,8 @@ async def invite_details(code: str) -> dict:
|
||||
|
||||
|
||||
@router.post("/signup")
|
||||
async def signup(payload: dict, response: Response) -> dict:
|
||||
async def signup(payload: SignupRequest, response: Response) -> dict:
|
||||
payload = request_data(payload)
|
||||
if not isinstance(payload, dict):
|
||||
raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="Invalid payload")
|
||||
invite_code = str(payload.get("invite_code") or "").strip()
|
||||
@@ -1054,7 +1064,8 @@ async def signup(payload: dict, response: Response) -> dict:
|
||||
|
||||
|
||||
@router.post("/password/forgot")
|
||||
async def forgot_password(payload: dict, request: Request) -> dict:
|
||||
async def forgot_password(payload: ForgotPasswordRequest, request: Request) -> dict:
|
||||
payload = request_data(payload)
|
||||
if not isinstance(payload, dict):
|
||||
raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="Invalid payload")
|
||||
identifier = payload.get("identifier") or payload.get("username") or payload.get("email")
|
||||
@@ -1106,7 +1117,8 @@ async def password_reset_verify(token: str) -> dict:
|
||||
|
||||
|
||||
@router.post("/password/reset")
|
||||
async def password_reset(payload: dict) -> dict:
|
||||
async def password_reset(payload: PasswordResetRequest) -> dict:
|
||||
payload = request_data(payload)
|
||||
if not isinstance(payload, dict):
|
||||
raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="Invalid payload")
|
||||
token = payload.get("token")
|
||||
@@ -1169,7 +1181,10 @@ async def profile(current_user: dict = Depends(get_current_user)) -> dict:
|
||||
|
||||
|
||||
@router.put("/profile/email")
|
||||
async def update_profile_email(payload: dict, current_user: dict = Depends(get_current_user)) -> dict:
|
||||
async def update_profile_email(
|
||||
payload: ProfileEmailUpdateRequest, current_user: dict = Depends(get_current_user)
|
||||
) -> dict:
|
||||
payload = request_data(payload)
|
||||
if not isinstance(payload, dict):
|
||||
raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="Invalid payload")
|
||||
username = str(current_user.get("username") or "").strip()
|
||||
@@ -1435,7 +1450,10 @@ async def delete_profile_invite(invite_id: int, current_user: dict = Depends(get
|
||||
|
||||
|
||||
@router.post("/password")
|
||||
async def change_password(payload: dict, current_user: dict = Depends(get_current_user)) -> dict:
|
||||
async def change_password(
|
||||
payload: ChangePasswordRequest, current_user: dict = Depends(get_current_user)
|
||||
) -> dict:
|
||||
payload = request_data(payload)
|
||||
current_password = payload.get("current_password") if isinstance(payload, dict) else None
|
||||
new_password = payload.get("new_password") if isinstance(payload, dict) else None
|
||||
if not isinstance(current_password, str) or not isinstance(new_password, str):
|
||||
|
||||
Reference in New Issue
Block a user