mirror of
https://github.com/open-webui/open-webui.git
synced 2026-09-21 13:38:19 -05:00
fix: enforce global web search and image generation switches on the legacy function-calling path (#27669)
The legacy function-calling path acted on the client-supplied `features` dict after checking only the per-user permission, so a user who still held `features.web_search` or `features.image_generation` could keep triggering web searches and image generation after an administrator had switched those off instance-wide. The native function-calling path already gates the equivalent builtin tools on `web.search.enable` and `image_generation.enable` in `get_builtin_tools`, so the two paths disagreed and the admin-level switch did not actually stop the outbound provider calls it was turned off to stop. Gate the legacy web search handler on `web.search.enable` at its call site, and gate `chat_image_generation_handler` on the two image switches internally. The image handler needs the check inside it because `image_generation.enable` and `images.edit.enable` are independent: editing stays available when generation is disabled, matching the `/images/generations` and `/images/edit` routes and the native `generate_image`/`edit_image` tools. The handler calls `image_generations`/`image_edits` directly and so bypasses the route guards, which is why the check has to live at the caller. The "Creating image" status event moves below the new guard so a disabled configuration returns without leaving an unresolved progress indicator in the chat.
This commit is contained in:
@@ -1666,12 +1666,6 @@ async def chat_image_generation_handler(request: Request, form_data: dict, extra
|
|||||||
message_list = form_data.get('messages', [])
|
message_list = form_data.get('messages', [])
|
||||||
else:
|
else:
|
||||||
chat = await Chats.get_chat_by_id_and_user_id(chat_id, user.id)
|
chat = await Chats.get_chat_by_id_and_user_id(chat_id, user.id)
|
||||||
await __event_emitter__(
|
|
||||||
{
|
|
||||||
'type': 'status',
|
|
||||||
'data': {'description': 'Creating image', 'done': False},
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
messages_map = chat.chat.get('history', {}).get('messages', {})
|
messages_map = chat.chat.get('history', {}).get('messages', {})
|
||||||
message_id = chat.chat.get('history', {}).get('currentId')
|
message_id = chat.chat.get('history', {}).get('currentId')
|
||||||
@@ -1691,9 +1685,22 @@ async def chat_image_generation_handler(request: Request, form_data: dict, extra
|
|||||||
for image in images:
|
for image in images:
|
||||||
input_images.append(image)
|
input_images.append(image)
|
||||||
|
|
||||||
|
# Called directly, bypassing the /images routes that enforce these switches.
|
||||||
|
editing = len(input_images) > 0 and await Config.get('images.edit.enable')
|
||||||
|
if not editing and not await Config.get('image_generation.enable'):
|
||||||
|
return form_data
|
||||||
|
|
||||||
|
if is_saved_chat_id(chat_id):
|
||||||
|
await __event_emitter__(
|
||||||
|
{
|
||||||
|
'type': 'status',
|
||||||
|
'data': {'description': 'Creating image', 'done': False},
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
system_message_content = ''
|
system_message_content = ''
|
||||||
|
|
||||||
if len(input_images) > 0 and await Config.get('images.edit.enable'):
|
if editing:
|
||||||
# Edit image(s)
|
# Edit image(s)
|
||||||
try:
|
try:
|
||||||
images = await image_edits(
|
images = await image_edits(
|
||||||
@@ -2527,7 +2534,7 @@ 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'] and await Config.get('web.search.enable'):
|
||||||
# features is client-supplied; re-check the permission the native FC path enforces.
|
# features is client-supplied; re-check the permission the native FC path enforces.
|
||||||
if getattr(user, 'role', None) == 'admin' or await has_permission(
|
if getattr(user, 'role', None) == 'admin' or await has_permission(
|
||||||
getattr(user, 'id', ''),
|
getattr(user, 'id', ''),
|
||||||
|
|||||||
Reference in New Issue
Block a user