mirror of
https://github.com/meta-llama/llama-stack.git
synced 2025-12-21 05:32:26 +00:00
fix(files): Enforce DELETE action permission for file deletion (#4275)
Previously, file deletion only checked READ permission via the _lookup_file_id() method. This meant any user with READ access to a file could also delete it, making it impossible to configure read-only file access. This change adds an 'action' parameter to fetch_all() and fetch_one() in AuthorizedSqlStore, defaulting to Action.READ for backward compatibility. The openai_delete_file() method now passes Action.DELETE, ensuring proper RBAC enforcement. With this fix, access policies can now distinguish between Users who can read/list files but not delete them Closes: #4274 Signed-off-by: Derek Higgins <derekh@redhat.com>
This commit is contained in:
parent
ee107aadd6
commit
4ff0c25c52
4 changed files with 20 additions and 10 deletions
|
|
@ -153,6 +153,7 @@ class AuthorizedSqlStore:
|
|||
limit: int | None = None,
|
||||
order_by: list[tuple[str, Literal["asc", "desc"]]] | None = None,
|
||||
cursor: tuple[str, str] | None = None,
|
||||
action: Action = Action.READ,
|
||||
) -> PaginatedResponse:
|
||||
"""Fetch all rows with automatic access control filtering."""
|
||||
access_where = self._build_access_control_where_clause(self.policy)
|
||||
|
|
@ -177,7 +178,7 @@ class AuthorizedSqlStore:
|
|||
str(record_id), table, User(principal=stored_owner_principal, attributes=stored_access_attrs)
|
||||
)
|
||||
|
||||
if is_action_allowed(self.policy, Action.READ, sql_record, current_user):
|
||||
if is_action_allowed(self.policy, action, sql_record, current_user):
|
||||
filtered_rows.append(row)
|
||||
|
||||
return PaginatedResponse(
|
||||
|
|
@ -190,6 +191,7 @@ class AuthorizedSqlStore:
|
|||
table: str,
|
||||
where: Mapping[str, Any] | None = None,
|
||||
order_by: list[tuple[str, Literal["asc", "desc"]]] | None = None,
|
||||
action: Action = Action.READ,
|
||||
) -> dict[str, Any] | None:
|
||||
"""Fetch one row with automatic access control checking."""
|
||||
results = await self.fetch_all(
|
||||
|
|
@ -197,6 +199,7 @@ class AuthorizedSqlStore:
|
|||
where=where,
|
||||
limit=1,
|
||||
order_by=order_by,
|
||||
action=action,
|
||||
)
|
||||
|
||||
return results.data[0] if results.data else None
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue