diff --git a/datasette/default_permissions.py b/datasette/default_permissions.py index 40ae54ab..ee182c85 100644 --- a/datasette/default_permissions.py +++ b/datasette/default_permissions.py @@ -7,6 +7,10 @@ def permission_allowed(datasette, actor, action, resource_type, resource_identif if action == "permissions-debug": if actor and actor.get("id") == "root": return True + elif action == "view-instance": + allow = datasette.metadata("allow") + if allow is not None: + return actor_matches_allow(actor, allow) elif action == "view-query": # Check if this query has a "allow" block in metadata assert resource_type == "query" diff --git a/tests/test_permissions.py b/tests/test_permissions.py index c90fdf7a..b5c2e00c 100644 --- a/tests/test_permissions.py +++ b/tests/test_permissions.py @@ -20,3 +20,23 @@ def test_execute_sql(allow, expected_anon, expected_auth): "/fixtures/q", cookies={"ds_actor": client.ds.sign({"id": "root"}, "actor")} ) assert expected_auth == auth_response.status + + +@pytest.mark.parametrize( + "allow,expected_anon,expected_auth", + [(None, 200, 200), ({}, 403, 403), ({"id": "root"}, 403, 200),], +) +def test_view_instance(allow, expected_anon, expected_auth): + with make_app_client(metadata={"allow": allow}) as client: + for path in ( + "/", + "/fixtures", + "/fixtures/compound_three_primary_keys", + "/fixtures/compound_three_primary_keys/a,a,a", + ): + anon_response = client.get(path) + assert expected_anon == anon_response.status + auth_response = client.get( + path, cookies={"ds_actor": client.ds.sign({"id": "root"}, "actor")}, + ) + assert expected_auth == auth_response.status