fix: harden container OAuth callback relay lifecycle

This commit is contained in:
haelyra committed 2026-10-11 01:58:37 -04:00
commit 5ad9cb931b
4 files changed
+143

No files matched your search

+49
View File
@@ -0,0 +1,49 @@
#!/usr/bin/env node
/**
* Codex OAuth login relay for the hardened harness.
*
* `codex login` binds its callback server to 127.0.0.1:1455 inside the
* container. A Docker port publish forwards to the container interface, not
* loopback, so the host browser's redirect to http://localhost:1455 is
* refused. This bridges the published interface to loopback:
*
* host 127.0.0.1:1455 -> container 0.0.0.0:1456 (this relay) -> 127.0.0.1:1455
*
* Run inside the networked session before `codex login`:
* node /ecc/docker/plugin-setup/codex-auth-relay.js &
*
* Env: ECC_RELAY_LISTEN (default 1456), ECC_RELAY_TARGET (default 1455).
*/
'use strict';
const net = require('net');
function portFromEnv(name, fallback) {
const value = process.env[name] === undefined ? fallback : process.env[name];
const port = Number(value);
if (!/^\d+$/.test(String(value)) || !Number.isInteger(port) || port < 1 || port > 65535) {
throw new Error(`${name} must be an integer port between 1 and 65535`);
}
return port;
}
const listenPort = portFromEnv('ECC_RELAY_LISTEN', 1456);
const targetPort = portFromEnv('ECC_RELAY_TARGET', 1455);
net.createServer(client => {
const upstream = net.connect(targetPort, '127.0.0.1');
client.pipe(upstream).pipe(client);
const drop = () => {
client.destroy();
upstream.destroy();
};
client.on('error', drop);
upstream.on('error', drop);
client.on('close', drop);
upstream.on('close', drop);
client.setTimeout(30000, drop);
upstream.setTimeout(30000, drop);
}).listen(listenPort, '0.0.0.0', () => {
console.log(`codex-auth-relay: 0.0.0.0:${listenPort} -> 127.0.0.1:${targetPort}`);
});
+3
View File
@@ -76,6 +76,9 @@ services:
profiles:
- networked
network_mode: default
# Codex OAuth callback bridge: host browser -> codex-auth-relay.js -> loopback.
ports:
- "127.0.0.1:1455:1456"
image: ecc-plugin-setup:debian
real-cli-ubuntu: