From b7a3b301a3883e90050d5b15f49f4d2bd69390fc Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 16 Mar 2026 12:07:04 +0000 Subject: [PATCH] fix(security): remove clear-text logging of sensitive data and fix Annotated+Depends pattern - audit_logs.py: Remove _db_dep pattern that fails with latest FastAPI on Python 3.11. Use clean DbSession = Annotated[Session, Depends(get_db)] without default values. - billing.py: Remove owner_id from log messages to fix CodeQL clear-text logging of sensitive information alerts. - files.py: Remove owner_id from log messages to fix CodeQL clear-text logging of sensitive information alerts. Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com> --- app/api/audit_logs.py | 10 ++++------ app/api/billing.py | 5 ++--- app/api/files.py | 7 +++---- 3 files changed, 9 insertions(+), 13 deletions(-) diff --git a/app/api/audit_logs.py b/app/api/audit_logs.py index 3f6fa9a7..41a01bcd 100644 --- a/app/api/audit_logs.py +++ b/app/api/audit_logs.py @@ -20,16 +20,14 @@ logger = logging.getLogger(__name__) router = APIRouter() -# Module-level dependency singleton to satisfy Ruff B008 while maintaining default values for manual calls (e.g. in decorators). -_db_dep = Depends(get_db) -DbSession = Annotated[Session, _db_dep] +DbSession = Annotated[Session, Depends(get_db)] @router.get("/audit-logs") @require_login async def list_audit_logs( request: Request, - db: DbSession = _db_dep, + db: DbSession, action: Annotated[str | None, Query(description="Filter by action (exact match)")] = None, user: Annotated[str | None, Query(description="Filter by username")] = None, resource_type: Annotated[str | None, Query(description="Filter by resource type")] = None, @@ -75,7 +73,7 @@ async def list_audit_logs( @require_login async def list_distinct_actions( request: Request, - db: DbSession = _db_dep, + db: DbSession, ) -> list[str]: """Return the distinct action values present in the audit log.""" from app.models import AuditLog @@ -88,7 +86,7 @@ async def list_distinct_actions( @require_login async def list_distinct_users( request: Request, - db: DbSession = _db_dep, + db: DbSession, ) -> list[str]: """Return the distinct user values present in the audit log.""" from app.models import AuditLog diff --git a/app/api/billing.py b/app/api/billing.py index c28b6aa8..57576c39 100644 --- a/app/api/billing.py +++ b/app/api/billing.py @@ -168,9 +168,8 @@ async def create_checkout_session( checkout_session = client.checkout.sessions.create(params=session_params) logger.info( - "Created Stripe checkout session %s for user %s plan %s", + "Created Stripe checkout session %s for user plan %s", checkout_session.id, - owner_id, body.plan_id, ) return {"checkout_url": checkout_session.url, "session_id": checkout_session.id} @@ -213,7 +212,7 @@ async def create_portal_session( } ) - logger.info("Created Stripe portal session for user %s", owner_id) + logger.info("Created Stripe portal session for user") return {"portal_url": portal.url} diff --git a/app/api/files.py b/app/api/files.py index 21e3c18a..64aa62b0 100644 --- a/app/api/files.py +++ b/app/api/files.py @@ -1497,7 +1497,7 @@ def claim_file(request: Request, file_id: int, db: DbSession): logger.exception(f"Error claiming file {file_id}: {e}") raise HTTPException(status_code=500, detail="Failed to claim document") - logger.info(f"File {file_id} claimed by user '{owner_id}'") + logger.info("File %d claimed by user", file_id) return {"status": "success", "message": "Document claimed successfully", "file_id": file_id, "owner_id": owner_id} @@ -1537,7 +1537,7 @@ def bulk_claim_files(request: Request, file_ids: list[int], db: DbSession): logger.exception(f"Error during bulk claim: {e}") raise HTTPException(status_code=500, detail="Failed to claim documents") - logger.info(f"Bulk claim by '{owner_id}': claimed={claimed}, skipped={[s['file_id'] for s in skipped]}") + logger.info("Bulk claim: claimed=%s, skipped=%s", claimed, [s["file_id"] for s in skipped]) return { "status": "success", "claimed_count": len(claimed), @@ -1590,8 +1590,7 @@ def assign_owner(request: Request, db: DbSession, owner_id: str = Query(...), fi logger.exception(f"Error assigning owner: {e}") raise HTTPException(status_code=500, detail="Failed to assign owner") - admin_name = get_current_owner_id(request) or "admin" - logger.info(f"Admin '{admin_name}' assigned owner_id='{owner_id}' to {updated} file(s)") + logger.info("Admin assigned owner to %d file(s)", updated) return { "status": "success", "message": f"Assigned owner to {updated} document(s)",