Fix File access permissions for .retreive and .delete

This commit is contained in:
Sameer Kankute 2026-01-29 11:19:24 +05:30
parent 833cf6a2cf
commit 70684ca86f
3 changed files with 28 additions and 6 deletions

View File

@ -369,6 +369,8 @@ class _PROXY_LiteLLMManagedFiles(CustomLogger, BaseFileEndpoints):
if (
call_type == CallTypes.afile_content.value
or call_type == CallTypes.afile_delete.value
or call_type == CallTypes.afile_retrieve.value
or call_type == CallTypes.afile_content.value
):
await self.check_managed_file_id_access(data, user_api_key_dict)
@ -972,8 +974,10 @@ class _PROXY_LiteLLMManagedFiles(CustomLogger, BaseFileEndpoints):
delete_response = None
specific_model_file_id_mapping = model_file_id_mapping.get(file_id)
if specific_model_file_id_mapping:
# Remove conflicting keys from data to avoid duplicate keyword arguments
filtered_data = {k: v for k, v in data.items() if k not in ("model", "file_id")}
for model_id, model_file_id in specific_model_file_id_mapping.items():
delete_response = await llm_router.afile_delete(model=model_id, file_id=model_file_id, **data) # type: ignore
delete_response = await llm_router.afile_delete(model=model_id, file_id=model_file_id, **filtered_data) # type: ignore
stored_file_object = await self.delete_unified_file_id(
file_id, litellm_parent_otel_span

View File

@ -812,7 +812,7 @@ async def get_file(
version,
)
data: Dict = {}
data: Dict = {"file_id": file_id}
try:
custom_llm_provider = (
@ -992,7 +992,7 @@ async def delete_file(
version,
)
data: Dict = {}
data: Dict = {"file_id": file_id}
try:
custom_llm_provider = (
provider
@ -1001,6 +1001,22 @@ async def delete_file(
or await get_custom_llm_provider_from_request_body(request=request)
or "openai"
)
# Call common_processing_pre_call_logic to trigger permission checks
base_llm_response_processor = ProxyBaseLLMRequestProcessing(data=data)
(
data,
litellm_logging_obj,
) = await base_llm_response_processor.common_processing_pre_call_logic(
request=request,
general_settings=general_settings,
user_api_key_dict=user_api_key_dict,
version=version,
proxy_logging_obj=proxy_logging_obj,
proxy_config=proxy_config,
route_type="afile_delete",
)
# Include original request and headers in the data
data = await add_litellm_data_to_request(
data=data,
@ -1060,11 +1076,13 @@ async def delete_file(
code=500,
)
# Remove file_id from data to avoid duplicate keyword argument
data_without_file_id = {k: v for k, v in data.items() if k != "file_id"}
response = await managed_files_obj.afile_delete(
file_id=file_id,
litellm_parent_otel_span=user_api_key_dict.parent_otel_span,
llm_router=llm_router,
**data,
**data_without_file_id,
)
else:
response = await litellm.afile_delete(

View File

@ -235,10 +235,10 @@ async def test_async_pre_call_hook_for_unified_finetuning_job():
@pytest.mark.asyncio
@pytest.mark.parametrize("call_type", ["afile_content", "afile_delete"])
@pytest.mark.parametrize("call_type", ["afile_content", "afile_delete", "afile_retrieve"])
async def test_can_user_call_unified_file_id(call_type):
"""
Test that on file retrieve, delete we check if the user has access to the file
Test that on file retrieve, delete, and content we check if the user has access to the file
"""
from litellm.proxy._types import UserAPIKeyAuth