diff options
Diffstat (limited to 'packages/meshbay-hub/tests/test_bundle_pepper.py')
| -rw-r--r-- | packages/meshbay-hub/tests/test_bundle_pepper.py | 39 |
1 files changed, 34 insertions, 5 deletions
diff --git a/packages/meshbay-hub/tests/test_bundle_pepper.py b/packages/meshbay-hub/tests/test_bundle_pepper.py index be9da19..6c9f63d 100644 --- a/packages/meshbay-hub/tests/test_bundle_pepper.py +++ b/packages/meshbay-hub/tests/test_bundle_pepper.py @@ -57,7 +57,8 @@ async def test_a_device_sign_in_gets_it_too(client): login = await _login(client, "pepper_dev") sk = Ed25519PrivateKey.generate() r = await client.post("/v1/users/devices", headers=_bearer(login["access_token"]), - json={"pk_auth_ed25519": pk_to_b64(sk.public_key()), "label": ""}) + json={"pk_auth_ed25519": pk_to_b64(sk.public_key()), "label": "", + "auth_key": KEY}) assert r.status_code == 201 ts = int(time.time()) sig = sk.sign(f"meshbay:user_auth:pepper_dev:{ts}".encode()) @@ -88,23 +89,51 @@ async def test_it_is_in_no_token(client): assert not any("pepper" in k for k in claims) +async def _ask(client, token, auth_key=None): + body = {} if auth_key is None else {"auth_key": auth_key} + return await client.post("/v1/users/me/bundle-pepper", headers=_bearer(token), json=body) + + @pytest.mark.asyncio -async def test_an_open_session_may_ask_and_a_node_may_not(client): +async def test_a_session_asks_with_the_passphrase_and_a_node_may_not(client): from test_node_scope_not_admin import _node_token await _register(client, "pepper_node") login = await _login(client, "pepper_node") - r = await client.get("/v1/users/me/bundle-pepper", headers=_bearer(login["access_token"])) + r = await _ask(client, login["access_token"], KEY) assert r.status_code == 200 assert r.json()["bundle_pepper"] == login["bundle_pepper"] node = await _node_token(client, "pepper_node", login["access_token"]) - r = await client.get("/v1/users/me/bundle-pepper", headers=_bearer(node)) + r = await _ask(client, node, KEY) assert r.status_code == 403 assert login["bundle_pepper"] not in r.text @pytest.mark.asyncio +async def test_a_token_alone_never_gets_it(client): + """ + Not a refreshed one, not the one sign-in handed out: a token is what a page + holds, and a pepper beside the bundles an operator keeps is the offline + passphrase oracle again. Two calls — refresh, then ask — must not add up + to what a refresh is refused. + """ + await _register(client, "pepper_bare") + login = await _login(client, "pepper_bare") + refreshed = (await client.post("/v1/users/token/refresh", + json={"refresh_token": login["refresh_token"]})).json() + + for token in (login["access_token"], refreshed["access_token"]): + bare = await _ask(client, token) + wrong = await _ask(client, token, "w" * 44) + assert bare.status_code == 422 + assert wrong.status_code == 403 + assert login["bundle_pepper"] not in bare.text + wrong.text + assert (await client.get("/v1/users/me/bundle-pepper", + headers=_bearer(login["access_token"]))).status_code in (404, 405) + + +@pytest.mark.asyncio async def test_it_is_sealed_at_rest_and_bound_to_its_account(client, db_session): await _register(client, "pepper_rest") login = await _login(client, "pepper_rest") @@ -157,7 +186,7 @@ async def test_it_is_never_logged(client): try: await _register(client, "pepper_log") login = await _login(client, "pepper_log") - await client.get("/v1/users/me/bundle-pepper", headers=_bearer(login["access_token"])) + await _ask(client, login["access_token"], KEY) finally: root.removeHandler(grab) root.setLevel(saved[0]) |