fix(proxy): drop unbounded IN from org admin check in /v2/user/info
Some checks failed
Cost map pins recheck / rerun-cost-map-guard (push) Has been cancelled
LiteLLM Rust DB / db-queries (push) Has been cancelled
LiteLLM Rust / rust-lint (push) Has been cancelled
LiteLLM Rust / rust-test (push) Has been cancelled
LiteLLM Rust / rust-wheel (push) Has been cancelled
Terraform Provider / gofmt, vet, build, test (push) Has been cancelled
Terraform Provider / Provider endpoints vs proxy OpenAPI schema (push) Has been cancelled

This commit is contained in:
jesus 2026-11-01 01:54:15 +00:00
parent f998fb05cb
commit a88b57e53d
2 changed files with 6 additions and 15 deletions

View file

@ -1111,13 +1111,11 @@ async def _target_in_caller_admin_org(
)
if not admin_memberships:
return False
shared_membership: Final = await prisma_client.db.litellm_organizationmembership.find_first(
where={
"user_id": target_user_id,
"organization_id": {"in": [membership.organization_id for membership in admin_memberships]},
}
admin_org_ids: Final = {membership.organization_id for membership in admin_memberships}
target_memberships: Final = await prisma_client.db.litellm_organizationmembership.find_many(
where={"user_id": target_user_id}
)
return shared_membership is not None
return any(membership.organization_id in admin_org_ids for membership in target_memberships)
@router.get(

View file

@ -3738,11 +3738,8 @@ _ORG_MEMBERSHIPS: Final = (
def _membership_matches(membership: SimpleNamespace, where: Mapping[str, object]) -> bool:
org_filter: Final = where.get("organization_id")
return (
membership.user_id == where["user_id"]
and ("user_role" not in where or membership.user_role == where["user_role"])
and (not isinstance(org_filter, dict) or membership.organization_id in org_filter["in"])
return membership.user_id == where["user_id"] and (
"user_role" not in where or membership.user_role == where["user_role"]
)
@ -3760,13 +3757,9 @@ def _org_admin_prisma(mocker: MockerFixture) -> MagicMock:
async def find_many(**kwargs: Mapping[str, object]) -> list[SimpleNamespace]:
return [m for m in _ORG_MEMBERSHIPS if _membership_matches(m, kwargs["where"])]
async def find_first(**kwargs: Mapping[str, object]) -> SimpleNamespace | None:
return next((m for m in _ORG_MEMBERSHIPS if _membership_matches(m, kwargs["where"])), None)
prisma: Final = mocker.MagicMock()
prisma.db.litellm_usertable.find_unique = mocker.AsyncMock(side_effect=find_unique)
prisma.db.litellm_organizationmembership.find_many = mocker.AsyncMock(side_effect=find_many)
prisma.db.litellm_organizationmembership.find_first = mocker.AsyncMock(side_effect=find_first)
return prisma