Skip to content

Permission bug in upsert API method #2262

@simonw

Description

@simonw

I just spotted this while working on #2261:

if upsert:
# Must have insert-row AND upsert-row permissions
if not (
await self.ds.permission_allowed(
request.actor, "insert-row", database_name, table_name
)
and await self.ds.permission_allowed(
request.actor, "update-row", database_name, table_name
)
):
return _error(
["Permission denied: need both insert-row and update-row"], 403
)
else:
# Must have insert-row permission
if not await self.ds.permission_allowed(
request.actor, "insert-row", resource=(database_name, table_name)
):
return _error(["Permission denied"], 403)

That looks wrong to me. Note how the later check does this:

self.ds.permission_allowed(request.actor, "insert-row", resource=(database_name, table_name))

But the earlier checks do this:

self.ds.permission_allowed(request.actor, "insert-row", database_name, table_name)

From looking at the code I think that second example is incorrect, it's using table_name as the default value:

datasette/datasette/app.py

Lines 898 to 900 in 569aacd

async def permission_allowed(
self, actor, action, resource=None, default=DEFAULT_NOT_SET
):

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions