2020-06-01 01:03:17 +00:00
|
|
|
from .fixtures import app_client
|
2020-06-10 19:39:54 +00:00
|
|
|
import baseconv
|
|
|
|
import pytest
|
|
|
|
import time
|
2020-06-01 01:03:17 +00:00
|
|
|
|
|
|
|
|
|
|
|
def test_auth_token(app_client):
|
2020-12-23 17:04:32 +00:00
|
|
|
"""The /-/auth-token endpoint sets the correct cookie"""
|
2020-06-01 01:03:17 +00:00
|
|
|
assert app_client.ds._root_token is not None
|
2020-11-15 23:24:22 +00:00
|
|
|
path = f"/-/auth-token?token={app_client.ds._root_token}"
|
2020-09-02 22:24:55 +00:00
|
|
|
response = app_client.get(
|
|
|
|
path,
|
|
|
|
)
|
2020-06-01 01:03:17 +00:00
|
|
|
assert 302 == response.status
|
|
|
|
assert "/" == response.headers["Location"]
|
2020-06-10 19:39:54 +00:00
|
|
|
assert {"a": {"id": "root"}} == app_client.ds.unsign(
|
|
|
|
response.cookies["ds_actor"], "actor"
|
|
|
|
)
|
2020-06-01 01:03:17 +00:00
|
|
|
# Check that a second with same token fails
|
|
|
|
assert app_client.ds._root_token is None
|
2020-09-02 22:24:55 +00:00
|
|
|
assert (
|
|
|
|
403
|
|
|
|
== app_client.get(
|
|
|
|
path,
|
|
|
|
).status
|
|
|
|
)
|
2020-06-01 01:03:17 +00:00
|
|
|
|
|
|
|
|
|
|
|
def test_actor_cookie(app_client):
|
2020-12-23 17:04:32 +00:00
|
|
|
"""A valid actor cookie sets request.scope['actor']"""
|
2020-06-10 19:39:54 +00:00
|
|
|
cookie = app_client.actor_cookie({"id": "test"})
|
2020-06-01 01:03:17 +00:00
|
|
|
response = app_client.get("/", cookies={"ds_actor": cookie})
|
|
|
|
assert {"id": "test"} == app_client.ds._last_request.scope["actor"]
|
2020-06-10 19:39:54 +00:00
|
|
|
|
|
|
|
|
2020-06-13 18:29:14 +00:00
|
|
|
def test_actor_cookie_invalid(app_client):
|
|
|
|
cookie = app_client.actor_cookie({"id": "test"})
|
|
|
|
# Break the signature
|
|
|
|
response = app_client.get("/", cookies={"ds_actor": cookie[:-1] + "."})
|
|
|
|
assert None == app_client.ds._last_request.scope["actor"]
|
|
|
|
# Break the cookie format
|
|
|
|
cookie = app_client.ds.sign({"b": {"id": "test"}}, "actor")
|
|
|
|
response = app_client.get("/", cookies={"ds_actor": cookie})
|
|
|
|
assert None == app_client.ds._last_request.scope["actor"]
|
|
|
|
|
|
|
|
|
2020-06-10 19:39:54 +00:00
|
|
|
@pytest.mark.parametrize(
|
2020-09-02 22:24:55 +00:00
|
|
|
"offset,expected",
|
|
|
|
[
|
|
|
|
((24 * 60 * 60), {"id": "test"}),
|
|
|
|
(-(24 * 60 * 60), None),
|
|
|
|
],
|
2020-06-10 19:39:54 +00:00
|
|
|
)
|
|
|
|
def test_actor_cookie_that_expires(app_client, offset, expected):
|
|
|
|
expires_at = int(time.time()) + offset
|
|
|
|
cookie = app_client.ds.sign(
|
|
|
|
{"a": {"id": "test"}, "e": baseconv.base62.encode(expires_at)}, "actor"
|
|
|
|
)
|
|
|
|
response = app_client.get("/", cookies={"ds_actor": cookie})
|
|
|
|
assert expected == app_client.ds._last_request.scope["actor"]
|
2020-06-29 04:17:30 +00:00
|
|
|
|
|
|
|
|
|
|
|
def test_logout(app_client):
|
|
|
|
response = app_client.get(
|
|
|
|
"/-/logout", cookies={"ds_actor": app_client.actor_cookie({"id": "test"})}
|
|
|
|
)
|
|
|
|
assert 200 == response.status
|
|
|
|
assert "<p>You are logged in as <strong>test</strong></p>" in response.text
|
|
|
|
# Actors without an id get full serialization
|
|
|
|
response2 = app_client.get(
|
|
|
|
"/-/logout", cookies={"ds_actor": app_client.actor_cookie({"name2": "bob"})}
|
|
|
|
)
|
|
|
|
assert 200 == response2.status
|
|
|
|
assert (
|
|
|
|
"<p>You are logged in as <strong>{'name2': 'bob'}</strong></p>"
|
|
|
|
in response2.text
|
|
|
|
)
|
|
|
|
# If logged out you get a redirect to /
|
2021-10-14 18:03:44 +00:00
|
|
|
response3 = app_client.get("/-/logout")
|
2020-06-29 04:17:30 +00:00
|
|
|
assert 302 == response3.status
|
|
|
|
# A POST to that page should log the user out
|
|
|
|
response4 = app_client.post(
|
|
|
|
"/-/logout",
|
|
|
|
csrftoken_from=True,
|
|
|
|
cookies={"ds_actor": app_client.actor_cookie({"id": "test"})},
|
|
|
|
)
|
2020-10-09 16:11:24 +00:00
|
|
|
# The ds_actor cookie should have been unset
|
|
|
|
assert response4.cookie_was_deleted("ds_actor")
|
2020-06-29 18:31:35 +00:00
|
|
|
# Should also have set a message
|
|
|
|
messages = app_client.ds.unsign(response4.cookies["ds_messages"], "messages")
|
|
|
|
assert [["You are now logged out", 2]] == messages
|
2020-06-29 18:40:40 +00:00
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.parametrize("path", ["/", "/fixtures", "/fixtures/facetable"])
|
|
|
|
def test_logout_button_in_navigation(app_client, path):
|
|
|
|
response = app_client.get(
|
|
|
|
path, cookies={"ds_actor": app_client.actor_cookie({"id": "test"})}
|
|
|
|
)
|
|
|
|
anon_response = app_client.get(path)
|
|
|
|
for fragment in (
|
2020-10-30 03:45:15 +00:00
|
|
|
"<strong>test</strong>",
|
2020-06-29 18:40:40 +00:00
|
|
|
'<form action="/-/logout" method="post">',
|
|
|
|
):
|
|
|
|
assert fragment in response.text
|
|
|
|
assert fragment not in anon_response.text
|
2020-07-01 21:25:59 +00:00
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.parametrize("path", ["/", "/fixtures", "/fixtures/facetable"])
|
|
|
|
def test_no_logout_button_in_navigation_if_no_ds_actor_cookie(app_client, path):
|
|
|
|
response = app_client.get(path + "?_bot=1")
|
|
|
|
assert "<strong>bot</strong>" in response.text
|
|
|
|
assert '<form action="/-/logout" method="post">' not in response.text
|