From 36329910436f5fbff14ae1bff155bf87fe67ce6c Mon Sep 17 00:00:00 2001 From: Patrick Date: Fri, 5 Jun 2026 16:04:06 +0200 Subject: [PATCH] Fix: Samba config PUT 422 + shadow:format setparm dash escaping Route /samba/{name} was matching before /samba/config, causing 422 on PUT /samba/config. Moved static routes before parameterized routes. Values starting with '-' (shadow: format = -%Y-%m-%d-%H%M) were parsed as CLI flags by net conf setparm. Added '--' separator to escape them. Co-Authored-By: Claude Sonnet 4.6 --- backend/routers/shares.py | 50 +++++++++++++++++++------------------- backend/services/shares.py | 2 +- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/backend/routers/shares.py b/backend/routers/shares.py index 57b2f33..ce88675 100644 --- a/backend/routers/shares.py +++ b/backend/routers/shares.py @@ -78,6 +78,31 @@ async def create_samba_share( raise HTTPException(status_code=500, detail=str(e)) +@router.get("/samba/config") +async def get_samba_config(current_user: str = Depends(get_current_user)): + """Get Samba global configuration""" + try: + config = share_manager.get_samba_global_config() + return config + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + + +@router.put("/samba/config") +async def set_samba_config( + request: SambaConfigRequest, + current_user: str = Depends(get_current_user) +): + """Update Samba global configuration parameters""" + try: + success = share_manager.set_samba_global_config(request.parameters) + if not success: + raise HTTPException(status_code=400, detail="Failed to update Samba configuration") + return {"status": "updated"} + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + + @router.put("/samba/{name}") async def update_samba_share( name: str, @@ -116,31 +141,6 @@ async def delete_samba_share( raise HTTPException(status_code=500, detail=str(e)) -@router.get("/samba/config") -async def get_samba_config(current_user: str = Depends(get_current_user)): - """Get Samba global configuration""" - try: - config = share_manager.get_samba_global_config() - return config - except Exception as e: - raise HTTPException(status_code=500, detail=str(e)) - - -@router.put("/samba/config") -async def set_samba_config( - request: SambaConfigRequest, - current_user: str = Depends(get_current_user) -): - """Update Samba global configuration parameters""" - try: - success = share_manager.set_samba_global_config(request.parameters) - if not success: - raise HTTPException(status_code=400, detail="Failed to update Samba configuration") - return {"status": "updated"} - except Exception as e: - raise HTTPException(status_code=500, detail=str(e)) - - @router.post("/samba/config/import") async def import_samba_config( request: SambaImportRequest, diff --git a/backend/services/shares.py b/backend/services/shares.py index 3aafb73..dd697c1 100644 --- a/backend/services/shares.py +++ b/backend/services/shares.py @@ -255,7 +255,7 @@ class SharesManager: try: for key, value in parameters.items(): result = subprocess.run( - ['/usr/bin/net', 'conf', 'setparm', 'global', key, value], + ['/usr/bin/net', 'conf', 'setparm', 'global', key, '--', value], capture_output=True, text=True, timeout=10