Refactor CreateTokenView to use allowed_resources() and rename variables, refs #2528

Changes:
- Use allowed_resources() instead of manual iteration with allowed() checks
- Rename all_permissions → all_actions
- Rename database_permissions → database_actions
- Rename resource_permissions → child_actions
- Update to use takes_parent/takes_child instead of takes_database/takes_resource

This makes the code more efficient (bulk permission checking) and uses
consistent naming throughout.
This commit is contained in:
Simon Willison 2025-10-25 09:56:08 -07:00
commit 4760cb9e06

View file

@ -649,43 +649,42 @@ class CreateTokenView(BaseView):
async def shared(self, request): async def shared(self, request):
self.check_permission(request) self.check_permission(request)
# Build list of databases and tables the user has permission to view # Build list of databases and tables the user has permission to view
allowed_databases = await self.ds.allowed_resources(
"view-database", request.actor
)
allowed_tables = await self.ds.allowed_resources("view-table", request.actor)
# Build database -> tables mapping
database_with_tables = [] database_with_tables = []
for database in self.ds.databases.values(): for db_resource in allowed_databases:
if database.name == "_memory": database_name = db_resource.parent
if database_name == "_memory":
continue continue
if not await self.ds.allowed(
action="view-database", # Find tables for this database
resource=DatabaseResource(database=database.name),
actor=request.actor,
):
continue
hidden_tables = await database.hidden_table_names()
tables = [] tables = []
for table in await database.table_names(): for table_resource in allowed_tables:
if table in hidden_tables: if table_resource.parent == database_name:
continue tables.append({
if not await self.ds.allowed( "name": table_resource.child,
action="view-table", "encoded": tilde_encode(table_resource.child)
resource=TableResource(database=database.name, table=table), })
actor=request.actor,
):
continue
tables.append({"name": table, "encoded": tilde_encode(table)})
database_with_tables.append( database_with_tables.append(
{ {
"name": database.name, "name": database_name,
"encoded": tilde_encode(database.name), "encoded": tilde_encode(database_name),
"tables": tables, "tables": tables,
} }
) )
return { return {
"actor": request.actor, "actor": request.actor,
"all_permissions": self.ds.actions.keys(), "all_actions": self.ds.actions.keys(),
"database_permissions": [ "database_actions": [
key for key, value in self.ds.actions.items() if value.takes_database key for key, value in self.ds.actions.items() if value.takes_parent
], ],
"resource_permissions": [ "child_actions": [
key for key, value in self.ds.actions.items() if value.takes_resource key for key, value in self.ds.actions.items() if value.takes_child
], ],
"database_with_tables": database_with_tables, "database_with_tables": database_with_tables,
} }