|
1 | 1 | """Test main handlers""" |
2 | 2 |
|
| 3 | +import time |
| 4 | +from urllib.parse import quote |
3 | 5 | from urllib.parse import urlparse |
4 | 6 |
|
5 | | -from bs4 import BeautifulSoup |
| 7 | +import jwt |
6 | 8 | import pytest |
| 9 | +from bs4 import BeautifulSoup |
7 | 10 |
|
8 | 11 | from binderhub import __version__ as binder_version |
9 | 12 |
|
@@ -123,3 +126,43 @@ async def test_loading_page(app, provider_prefix, repo, ref, path, path_type, st |
123 | 126 | nbviewer_url = soup.find(id='nbviewer-preview').find('iframe').attrs['src'] |
124 | 127 | r = await async_requests.get(nbviewer_url) |
125 | 128 | assert r.status_code == 200, f"{r.status_code} {nbviewer_url}" |
| 129 | + |
| 130 | + |
| 131 | +@pytest.mark.parametrize( |
| 132 | + "origin,host,expected_origin", |
| 133 | + [ |
| 134 | + ("https://my.host", "my.host", "my.host"), |
| 135 | + ("https://my.origin", "my.host", "my.origin"), |
| 136 | + (None, "my.host", "my.host"), |
| 137 | + ], |
| 138 | +) |
| 139 | +async def test_build_token_origin(app, origin, host, expected_origin): |
| 140 | + provider_spec = "git/{}/HEAD".format( |
| 141 | + quote( |
| 142 | + "https://github.com/binderhub-ci-repos/cached-minimal-dockerfile", |
| 143 | + safe="", |
| 144 | + ) |
| 145 | + ) |
| 146 | + uri = f"/v2/{provider_spec}" |
| 147 | + headers = {} |
| 148 | + if origin: |
| 149 | + headers["Origin"] = origin |
| 150 | + if host: |
| 151 | + headers["Host"] = host |
| 152 | + |
| 153 | + r = await async_requests.get(app.url + uri, headers=headers) |
| 154 | + |
| 155 | + soup = BeautifulSoup(r.text, "html5lib") |
| 156 | + assert soup.find(id="build-token") |
| 157 | + token_element = soup.find(id="build-token") |
| 158 | + assert token_element |
| 159 | + assert "data-token" in token_element.attrs |
| 160 | + build_token = token_element["data-token"] |
| 161 | + payload = jwt.decode( |
| 162 | + build_token, |
| 163 | + audience=provider_spec, |
| 164 | + options=dict(verify_signature=False), |
| 165 | + ) |
| 166 | + assert payload["aud"] == provider_spec |
| 167 | + assert payload["origin"] == expected_origin |
| 168 | + assert time.time() < payload["exp"] < time.time() + 7200 |
0 commit comments