| """AuthDigestDomain: presence, format, and inheritance of the domain= | |
| attribute in the WWW-Authenticate challenge. | |
| """ | |
| from . import digest_client as dc | |
| from .env import AAATestEnv | |
| class TestDigestDomain: | |
| def url(self, env, path): | |
| return env.mkurl("http", "aaa", path) | |
| def test_digest_040_domain_attribute_present(self, env): | |
| r = env.curl_get(self.url(env, "/digest/domain/secret.txt")) | |
| assert r.response["status"] == 401 | |
| challenge = dc.DigestChallenge.parse(r.response["header"]["www-authenticate"]) | |
| # set_uri_list() (mod_auth_digest.c) builds a single quoted, | |
| # space-separated list from the configured AuthDigestDomain URIs. | |
| assert challenge.domain == "/digest/domain/ https://mirror.example.org/other/" | |
| assert challenge.domain_list() == [ | |
| "/digest/domain/", "https://mirror.example.org/other/"] | |
| def test_digest_041_no_domain_configured_omits_attribute(self, env): | |
| r = env.curl_get(self.url(env, "/digest/default/secret.txt")) | |
| assert r.response["status"] == 401 | |
| challenge = dc.DigestChallenge.parse(r.response["header"]["www-authenticate"]) | |
| assert challenge.domain is None | |
| def test_digest_042_domain_location_still_authenticates(self, env): | |
| r = env.curl_get(self.url(env, "/digest/domain/secret.txt")) | |
| challenge = dc.DigestChallenge.parse(r.response["header"]["www-authenticate"]) | |
| auth = dc.build_authorization( | |
| AAATestEnv.DIGEST_USER, challenge, AAATestEnv.DIGEST_PASSWORD, | |
| method="GET", uri="/digest/domain/secret.txt") | |
| r = env.curl_get(self.url(env, "/digest/domain/secret.txt"), | |
| options=["-H", f"Authorization: {auth}"]) | |
| assert r.response["status"] == 200 | |
| assert r.response["body"].decode() == "digest-domain-secret\n" | |
| def test_digest_043_domain_inherited_by_nested_path(self, env): | |
| # AuthDigestDomain is set on /digest/domain/; a path nested below it | |
| # inherits the same directory config (same realm/credentials/domain). | |
| r = env.curl_get(self.url(env, "/digest/domain/nested/secret.txt")) | |
| assert r.response["status"] == 401 | |
| challenge = dc.DigestChallenge.parse(r.response["header"]["www-authenticate"]) | |
| assert challenge.realm == AAATestEnv.REALM | |
| assert challenge.domain == "/digest/domain/ https://mirror.example.org/other/" | |
| auth = dc.build_authorization( | |
| AAATestEnv.DIGEST_USER, challenge, AAATestEnv.DIGEST_PASSWORD, | |
| method="GET", uri="/digest/domain/nested/secret.txt") | |
| r = env.curl_get(self.url(env, "/digest/domain/nested/secret.txt"), | |
| options=["-H", f"Authorization: {auth}"]) | |
| assert r.response["status"] == 200 | |
| assert r.response["body"].decode() == "digest-domain-nested-secret\n" |