mirror of
https://github.com/open-webui/open-webui.git
synced 2026-08-13 01:02:25 -06:00
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:
@@ -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)
|
||||
|
||||
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
|
||||
if metadata.get('params', {}).get('function_calling') == 'legacy':
|
||||
form_data = await chat_web_search_handler(request, form_data, extra_params, user)
|
||||
# features is client-supplied; re-check the permission the native FC path enforces.
|
||||
if getattr(user, 'role', None) == 'admin' or await has_permission(
|
||||
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']:
|
||||
# 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)
|
||||
# features is client-supplied; re-check the permission the direct /images routes enforce.
|
||||
if getattr(user, 'role', None) == 'admin' or await has_permission(
|
||||
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']:
|
||||
engine = await Config.get('code_interpreter.engine', 'pyodide')
|
||||
|
||||
Reference in New Issue
Block a user