feat(egress): add preserve_auth flag to pass agent Authorization through
test / integration-docker (push) Successful in 11s
test / unit (push) Successful in 37s
lint / lint (push) Successful in 55s
Update Quality Badges / update-badges (push) Failing after 37s
test / integration-firecracker (push) Successful in 4m49s
test / coverage (push) Successful in 14s
test / publish-infra (push) Successful in 1m42s

Adds a per-route boolean field preserve_auth (default false) that skips
the gateway's Authorization header stripping for that host. Intended for
registry endpoints like Docker Hub (registry-1.docker.io) and GHCR
(ghcr.io) where the agent must supply its own per-scope bearer token.

Threaded through ManifestEgressRoute → EgressRoute → Route, serialized
in route_to_yaml_dict, and parsed in parse_routes. The strip at
egress_addon.py now checks route.preserve_auth before popping the header.

Closes #392
This commit was merged in pull request #453.
This commit is contained in:
2026-07-21 18:09:50 +00:00
committed by didericis
parent 2cd44cf79a
commit ccd987a501
6 changed files with 73 additions and 5 deletions
@@ -413,6 +413,28 @@ class TestAuthInjection(unittest.TestCase):
assert flow.response is not None
self.assertEqual(403, flow.response.status_code)
def test_preserve_auth_passes_agent_token_through(self) -> None:
route = Route(host="registry-1.docker.io", preserve_auth=True)
addon = _addon(Config(routes=(route,)))
flow = _Flow(_Request(
host="registry-1.docker.io",
headers={"authorization": "Bearer agent-registry-token"},
))
_run_request(addon, flow)
self.assertEqual("Bearer agent-registry-token", flow.request.headers.get("authorization"))
self.assertIsNone(flow.response)
def test_default_route_strips_agent_auth(self) -> None:
route = Route(host="registry-1.docker.io")
addon = _addon(Config(routes=(route,)))
flow = _Flow(_Request(
host="registry-1.docker.io",
headers={"authorization": "Bearer agent-registry-token"},
))
_run_request(addon, flow)
self.assertIsNone(flow.request.headers.get("authorization"))
self.assertIsNone(flow.response)
# ---------------------------------------------------------------------------
# git push / fetch over HTTPS
+18
View File
@@ -458,6 +458,24 @@ class TestRole(unittest.TestCase):
_bottle([{"host": "x.example", "role": ["x", 42]}])
class TestPreserveAuth(unittest.TestCase):
def test_omitted_defaults_false(self):
b = _bottle([{"host": "registry-1.docker.io"}])
self.assertFalse(b.egress.routes[0].PreserveAuth)
def test_true_accepted(self):
b = _bottle([{"host": "registry-1.docker.io", "preserve_auth": True}])
self.assertTrue(b.egress.routes[0].PreserveAuth)
def test_false_accepted(self):
b = _bottle([{"host": "registry-1.docker.io", "preserve_auth": False}])
self.assertFalse(b.egress.routes[0].PreserveAuth)
def test_non_bool_rejected(self):
with self.assertRaises(ManifestError):
_bottle([{"host": "registry-1.docker.io", "preserve_auth": "yes"}])
class TestPipelockKeyRejected(unittest.TestCase):
def test_pipelock_key_rejected_as_unknown(self):
with self.assertRaises(ManifestError):