mirror of
https://github.com/simonw/datasette.git
synced 2025-12-10 16:51:24 +01:00
Tests for /-/create-token with restrictions, closes #1947
This commit is contained in:
parent
6e5ab9e7b3
commit
420d0a0ee2
2 changed files with 23 additions and 18 deletions
|
|
@ -66,7 +66,7 @@
|
||||||
<h2>All tables in "{{ database.name }}"</h2>
|
<h2>All tables in "{{ database.name }}"</h2>
|
||||||
<ul>
|
<ul>
|
||||||
{% for permission in database_permissions %}
|
{% for permission in database_permissions %}
|
||||||
<li><label><input type="checkbox" name="db:{{ database.encoded }}:{{ permission }}"> {{ permission }}</label></li>
|
<li><label><input type="checkbox" name="database:{{ database.encoded }}:{{ permission }}"> {{ permission }}</label></li>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</ul>
|
</ul>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
|
||||||
|
|
@ -115,44 +115,46 @@ def test_no_logout_button_in_navigation_if_no_ds_actor_cookie(app_client, path):
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
"post_data,errors,expected_duration",
|
"post_data,errors,expected_duration,expected_r",
|
||||||
(
|
(
|
||||||
({"expire_type": ""}, [], None),
|
({"expire_type": ""}, [], None, None),
|
||||||
({"expire_type": "x"}, ["Invalid expire duration"], None),
|
({"expire_type": "x"}, ["Invalid expire duration"], None, None),
|
||||||
({"expire_type": "minutes"}, ["Invalid expire duration"], None),
|
({"expire_type": "minutes"}, ["Invalid expire duration"], None, None),
|
||||||
(
|
(
|
||||||
{"expire_type": "minutes", "expire_duration": "x"},
|
{"expire_type": "minutes", "expire_duration": "x"},
|
||||||
["Invalid expire duration"],
|
["Invalid expire duration"],
|
||||||
None,
|
None,
|
||||||
|
None,
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
{"expire_type": "minutes", "expire_duration": "-1"},
|
{"expire_type": "minutes", "expire_duration": "-1"},
|
||||||
["Invalid expire duration"],
|
["Invalid expire duration"],
|
||||||
None,
|
None,
|
||||||
|
None,
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
{"expire_type": "minutes", "expire_duration": "0"},
|
{"expire_type": "minutes", "expire_duration": "0"},
|
||||||
["Invalid expire duration"],
|
["Invalid expire duration"],
|
||||||
None,
|
None,
|
||||||
|
None,
|
||||||
),
|
),
|
||||||
|
({"expire_type": "minutes", "expire_duration": "10"}, [], 600, None),
|
||||||
|
({"expire_type": "hours", "expire_duration": "10"}, [], 10 * 60 * 60, None),
|
||||||
|
({"expire_type": "days", "expire_duration": "3"}, [], 60 * 60 * 24 * 3, None),
|
||||||
|
# Token restrictions
|
||||||
|
({"all:view-instance": "on"}, [], None, {"a": ["vi"]}),
|
||||||
|
({"database:fixtures:view-query": "on"}, [], None, {"d": {"fixtures": ["vq"]}}),
|
||||||
(
|
(
|
||||||
{"expire_type": "minutes", "expire_duration": "10"},
|
{"resource:fixtures:facetable:insert-row": "on"},
|
||||||
[],
|
[],
|
||||||
600,
|
None,
|
||||||
),
|
{"r": {"fixtures": {"facetable": ["ir"]}}},
|
||||||
(
|
|
||||||
{"expire_type": "hours", "expire_duration": "10"},
|
|
||||||
[],
|
|
||||||
10 * 60 * 60,
|
|
||||||
),
|
|
||||||
(
|
|
||||||
{"expire_type": "days", "expire_duration": "3"},
|
|
||||||
[],
|
|
||||||
60 * 60 * 24 * 3,
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
def test_auth_create_token(app_client, post_data, errors, expected_duration):
|
def test_auth_create_token(
|
||||||
|
app_client, post_data, errors, expected_duration, expected_r
|
||||||
|
):
|
||||||
assert app_client.get("/-/create-token").status == 403
|
assert app_client.get("/-/create-token").status == 403
|
||||||
ds_actor = app_client.actor_cookie({"id": "test"})
|
ds_actor = app_client.actor_cookie({"id": "test"})
|
||||||
response = app_client.get("/-/create-token", cookies={"ds_actor": ds_actor})
|
response = app_client.get("/-/create-token", cookies={"ds_actor": ds_actor})
|
||||||
|
|
@ -173,6 +175,9 @@ def test_auth_create_token(app_client, post_data, errors, expected_duration):
|
||||||
# Extract token from page
|
# Extract token from page
|
||||||
token = response2.text.split('value="dstok_')[1].split('"')[0]
|
token = response2.text.split('value="dstok_')[1].split('"')[0]
|
||||||
details = app_client.ds.unsign(token, "token")
|
details = app_client.ds.unsign(token, "token")
|
||||||
|
if expected_r:
|
||||||
|
r = details.pop("_r")
|
||||||
|
assert r == expected_r
|
||||||
assert details.keys() == {"a", "t", "d"} or details.keys() == {"a", "t"}
|
assert details.keys() == {"a", "t", "d"} or details.keys() == {"a", "t"}
|
||||||
assert details["a"] == "test"
|
assert details["a"] == "test"
|
||||||
if expected_duration is None:
|
if expected_duration is None:
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue