Просмотр исходного кода

Fix SMTP endpoints returning 401 when authentication is disabled

SMTP settings endpoints (GET/POST /auth/smtp, POST /auth/smtp/test)
used Depends(get_current_active_user) which always requires a logged-in
user. Replaced with RequirePermissionIfAuthEnabled to match the pattern
used by all other settings endpoints — accessible when auth is disabled,
permission-gated when auth is enabled.
maziggy 6 месяцев назад
Родитель
Сommit
d334e2a3ef
1 измененных файлов с 9 добавлено и 37 удалено
  1. 9 37
      backend/app/api/routes/auth.py

+ 9 - 37
backend/app/api/routes/auth.py

@@ -8,6 +8,8 @@ from sqlalchemy.orm import selectinload
 from backend.app.api.routes.settings import get_external_login_url
 from backend.app.core.auth import (
     ACCESS_TOKEN_EXPIRE_MINUTES,
+    Permission,
+    RequirePermissionIfAuthEnabled,
     authenticate_user,
     authenticate_user_by_email,
     create_access_token,
@@ -328,24 +330,14 @@ async def logout():
 @router.post("/smtp/test", response_model=TestSMTPResponse)
 async def test_smtp_connection(
     test_request: TestSMTPRequest,
-    current_user: User = Depends(get_current_active_user),
+    current_user: User | None = RequirePermissionIfAuthEnabled(Permission.SETTINGS_UPDATE),
     db: AsyncSession = Depends(get_db),
 ):
-    """Test SMTP connection with provided settings (admin only)."""
+    """Test SMTP connection with provided settings (admin only when auth enabled)."""
     import logging
 
     logger = logging.getLogger(__name__)
 
-    # Reload user with groups for proper is_admin check
-    result = await db.execute(select(User).where(User.id == current_user.id).options(selectinload(User.groups)))
-    user = result.scalar_one()
-
-    if not user.is_admin:
-        raise HTTPException(
-            status_code=status.HTTP_403_FORBIDDEN,
-            detail="Only admins can test SMTP settings",
-        )
-
     try:
         smtp_settings = SMTPSettings(
             smtp_host=test_request.smtp_host,
@@ -375,20 +367,10 @@ async def test_smtp_connection(
 
 @router.get("/smtp", response_model=SMTPSettings | None)
 async def get_smtp_config(
-    current_user: User = Depends(get_current_active_user),
+    current_user: User | None = RequirePermissionIfAuthEnabled(Permission.SETTINGS_READ),
     db: AsyncSession = Depends(get_db),
 ):
-    """Get SMTP settings (admin only). Password is not returned."""
-    # Reload user with groups for proper is_admin check
-    result = await db.execute(select(User).where(User.id == current_user.id).options(selectinload(User.groups)))
-    user = result.scalar_one()
-
-    if not user.is_admin:
-        raise HTTPException(
-            status_code=status.HTTP_403_FORBIDDEN,
-            detail="Only admins can view SMTP settings",
-        )
-
+    """Get SMTP settings (admin only when auth enabled). Password is not returned."""
     smtp_settings = await get_smtp_settings(db)
     if smtp_settings:
         # Don't return password in response
@@ -399,28 +381,18 @@ async def get_smtp_config(
 @router.post("/smtp", response_model=dict)
 async def save_smtp_config(
     smtp_settings: SMTPSettings,
-    current_user: User = Depends(get_current_active_user),
+    current_user: User | None = RequirePermissionIfAuthEnabled(Permission.SETTINGS_UPDATE),
     db: AsyncSession = Depends(get_db),
 ):
-    """Save SMTP settings (admin only)."""
+    """Save SMTP settings (admin only when auth enabled)."""
     import logging
 
     logger = logging.getLogger(__name__)
 
-    # Reload user with groups for proper is_admin check
-    result = await db.execute(select(User).where(User.id == current_user.id).options(selectinload(User.groups)))
-    user = result.scalar_one()
-
-    if not user.is_admin:
-        raise HTTPException(
-            status_code=status.HTTP_403_FORBIDDEN,
-            detail="Only admins can update SMTP settings",
-        )
-
     try:
         await save_smtp_settings(db, smtp_settings)
         await db.commit()
-        logger.info(f"SMTP settings updated by admin user: {user.username}")
+        logger.info(f"SMTP settings updated by admin user: {current_user.username if current_user else 'anonymous'}")
         return {"message": "SMTP settings saved successfully"}
     except Exception as e:
         await db.rollback()