fix: enforce feature permissions on the legacy chat-features block (image_generation, web_search) (#26703)
The legacy features block in process_chat_payload honoured client-supplied features.image_generation and features.web_search flags and dispatched to the image generation/edit provider and the web-search provider without re-checking the per-user permission that the direct /images routes and the native function-calling path enforce. A user denied features.image_generation or features.web_search could still trigger billable server-side image generation or web search via POST /api/chat/completions with params.function_calling set to legacy. Gate both branches on admin-or-has_permission before invoking chat_image_generation_handler / chat_web_search_handler, matching the existing code_interpreter gate, so a forged flag from an unpermitted user is ignored. Normal completions and permitted users are unaffected.
This commit is contained in:
1 parent
f65f893ff1
commit
897d69a35c
1 file changed
+18
-6
@@ -2523,14 +2523,26 @@ async def process_chat_payload(request, form_data, user, metadata, model):
|
|||||||
form_data = await add_memory_context(request, form_data, user, model)
|
form_data = await add_memory_context(request, form_data, user, model)
|
||||||
|
|
||||||
if 'web_search' in features and features['web_search']:
|
if 'web_search' in features and features['web_search']:
|
||||||
# Skip forced RAG web search when native FC is enabled - model can use web_search tool
|
# features is client-supplied; re-check the permission the native FC path enforces.
|
||||||
if metadata.get('params', {}).get('function_calling') == 'legacy':
|
if getattr(user, 'role', None) == 'admin' or await has_permission(
|
||||||
form_data = await chat_web_search_handler(request, form_data, extra_params, user)
|
getattr(user, 'id', ''),
|
||||||
|
'features.web_search',
|
||||||
|
await Config.get('user.permissions'),
|
||||||
|
):
|
||||||
|
# Skip forced RAG web search when native FC is enabled - model can use web_search tool
|
||||||
|
if metadata.get('params', {}).get('function_calling') == 'legacy':
|
||||||
|
form_data = await chat_web_search_handler(request, form_data, extra_params, user)
|
||||||
|
|
||||||
if 'image_generation' in features and features['image_generation']:
|
if 'image_generation' in features and features['image_generation']:
|
||||||
# Skip forced image generation when native FC is enabled - model can use generate_image tool
|
# features is client-supplied; re-check the permission the direct /images routes enforce.
|
||||||
if metadata.get('params', {}).get('function_calling') == 'legacy':
|
if getattr(user, 'role', None) == 'admin' or await has_permission(
|
||||||
form_data = await chat_image_generation_handler(request, form_data, extra_params, user)
|
getattr(user, 'id', ''),
|
||||||
|
'features.image_generation',
|
||||||
|
await Config.get('user.permissions'),
|
||||||
|
):
|
||||||
|
# Skip forced image generation when native FC is enabled - model can use generate_image tool
|
||||||
|
if metadata.get('params', {}).get('function_calling') == 'legacy':
|
||||||
|
form_data = await chat_image_generation_handler(request, form_data, extra_params, user)
|
||||||
|
|
||||||
if 'code_interpreter' in features and features['code_interpreter']:
|
if 'code_interpreter' in features and features['code_interpreter']:
|
||||||
engine = await Config.get('code_interpreter.engine', 'pyodide')
|
engine = await Config.get('code_interpreter.engine', 'pyodide')
|
||||||
|
|||||||
Reference in new issue
Block a user