fix: deny chained access to unregistered base models for non-admins (#26905)

A workspace model shared publicly could be used by any user even when its
base model was private. Unregistered base models (no row in the model
table) are admin-only for direct use — get_filtered_models hides them from
non-admins and check_model_access rejects them — but has_base_model_access
treated a missing row as "no ACL" and allowed the chained request through.

has_base_model_access now takes the caller's role and only allows an
unregistered base model hop for admins, so a shared preset can no longer
reach a base model the caller could not use directly. Registered base
models keep their existing grant-based enforcement.


Claude-Session: https://claude.ai/code/session_018toPfJW1hMXAhokGaL43Ep

Co-authored-by: Claude <noreply@anthropic.com>
This commit is contained in:
Classic298
2026-07-24 01:32:32 -05:00
committed by GitHub
co-authored by Claude
parent f7e7f32102
commit fe4b319428
2 changed files with 11 additions and 6 deletions
+1 -1
View File
@@ -456,7 +456,7 @@ async def check_model_access(user, model, db=None):
raise Exception('Model not found')
# Enforce access on chained base models
if not await has_base_model_access(user.id, model_info, db=db):
if not await has_base_model_access(user.id, model_info, user_role=user.role, db=db):
raise Exception('Model not found')