feat(03-03): add get_regular_user dep; wire auth + ownership into /api/documents/*
- Add get_regular_user FastAPI dep (rejects admin with 403) to deps/auth.py - Wire Depends(get_regular_user) into all 6 /api/documents/* handlers - upload-url: replace null-user/... object_key with str(current_user.id)/...; set user_id=current_user.id - confirm: remove Wave 2 doc.user_id is None guard — quota runs unconditionally; add ownership assertion (404 on cross-user) - list: filter by user_id=current_user.id via storage.list_metadata(user_id=...) - get/delete/classify: ownership assertion (doc.user_id != current_user.id → 404) - storage.list_metadata: add required user_id param + Document.user_id == user_id filter - storage.delete_document: remove if doc.user_id is not None guard; use CASE WHEN for SQLite-compat quota decrement - Tests: update existing tests to pass auth headers; implement test_cross_user_access_404, test_admin_cannot_access_documents, test_documents_require_auth; mark test_confirm_endpoint xfail(strict=False) for SQLite UUID mismatch
This commit is contained in:
@@ -90,3 +90,20 @@ async def get_current_admin(
|
||||
detail="Admin access required",
|
||||
)
|
||||
return user
|
||||
|
||||
|
||||
async def get_regular_user(
|
||||
user: User = Depends(get_current_user),
|
||||
) -> User:
|
||||
"""Reject admin accounts on all /api/documents/* endpoints (D-16, SC4).
|
||||
|
||||
Admin accounts cannot access document content (CLAUDE.md + SEC-04).
|
||||
Returns 403 (not 404) — the admin knows document endpoints exist.
|
||||
Regular users are passed through unchanged.
|
||||
"""
|
||||
if user.role == "admin":
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_403_FORBIDDEN,
|
||||
detail="Admin accounts cannot access document content",
|
||||
)
|
||||
return user
|
||||
|
||||
Reference in New Issue
Block a user