🔒 security: move IMAP credentials to request body

Moved IMAP credentials from query parameters to the request body
for the test-connection endpoint to prevent cleartext logging.
Implemented a Pydantic model (IMAPTestRequest) for request body validation.

Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com>
This commit is contained in:
google-labs-jules[bot]
2026-03-23 16:18:16 +00:00
parent fe3877a55a
commit 34c910e131
+20 -16
View File
@@ -1,39 +1,43 @@
import logging
from datetime import datetime
from typing import Any, Dict
from typing import Any, Dict, Optional
from app.core.security import require_admin_auth
from app.services.imap_client import IMAPClient
from fastapi import APIRouter, BackgroundTasks, Depends, HTTPException
from pydantic import BaseModel
router = APIRouter()
logger = logging.getLogger(__name__)
class IMAPTestRequest(BaseModel):
"""IMAP connection test request body"""
server: Optional[str] = None
port: int = 993
username: Optional[str] = None
password: Optional[str] = None
ssl: bool = True
@router.post("/test-connection")
async def test_imap_connection(
request: IMAPTestRequest,
auth: dict = Depends(require_admin_auth),
server: str = None,
port: int = 993,
username: str = None,
password: str = None,
ssl: bool = True,
) -> Dict[str, Any]:
"""
Test connection to an IMAP server and gather mailbox statistics
Security: Requires authentication (X-API-Key or Bearer token)
Note: Credentials should be passed in request body, not query params
Credentials should be passed in request body
"""
# Security: Don't accept credentials in query parameters (they get logged)
if any([server, username, password]):
logger.warning("IMAP credentials passed as query parameters - this is insecure")
raise HTTPException(
status_code=400,
detail="Credentials should be passed in request body, not query parameters",
)
imap_client = IMAPClient(server=server, port=port, username=username, password=password)
imap_client = IMAPClient(
server=request.server,
port=request.port,
username=request.username,
password=request.password,
)
success, message, stats = imap_client.test_connection()