mirror of
https://github.com/obra/superpowers.git
synced 2026-06-15 15:19:04 +08:00
Fix companion stop metadata and token permissions
This commit is contained in:
@@ -243,6 +243,41 @@ async function runTests() {
|
||||
assert.strictEqual(keyB, keyA, 'restart should reuse the same session key');
|
||||
});
|
||||
|
||||
await test('hardens existing persisted token file permissions', async () => {
|
||||
const dir = fs.mkdtempSync('/tmp/bs-token-mode-');
|
||||
const portFile = path.join(dir, '.last-port');
|
||||
const tokenFile = path.join(dir, '.last-token');
|
||||
const token = 'efefefefefefefefefefefefefefefef';
|
||||
let srv = null;
|
||||
|
||||
try {
|
||||
fs.writeFileSync(tokenFile, token, { mode: 0o644 });
|
||||
fs.chmodSync(tokenFile, 0o644);
|
||||
srv = spawn('node', [SERVER], {
|
||||
env: {
|
||||
...process.env,
|
||||
BRAINSTORM_DIR: path.join(dir, 's1'),
|
||||
BRAINSTORM_PORT_FILE: portFile,
|
||||
BRAINSTORM_TOKEN_FILE: tokenFile,
|
||||
BRAINSTORM_LIFECYCLE_CHECK_MS: 100000
|
||||
}
|
||||
});
|
||||
let out = ''; srv.stdout.on('data', d => out += d.toString());
|
||||
for (let i = 0; i < 60 && !out.includes('server-started'); i++) await sleep(50);
|
||||
assert(out.includes('server-started'), 'server should start with persisted token');
|
||||
|
||||
if (process.platform !== 'win32') {
|
||||
const mode = fs.statSync(tokenFile).mode & 0o777;
|
||||
assert.strictEqual(mode, 0o600, `.last-token mode should be 0600, got ${mode.toString(8)}`);
|
||||
} else {
|
||||
assert(fs.existsSync(tokenFile), 'token file should remain present on Windows');
|
||||
}
|
||||
} finally {
|
||||
await killAndWait(srv);
|
||||
fs.rmSync(dir, { recursive: true, force: true });
|
||||
}
|
||||
});
|
||||
|
||||
await test('stored key can authenticate WebSocket after same-port restart', async () => {
|
||||
const dir = fs.mkdtempSync('/tmp/bs-reconnect-');
|
||||
const portFile = path.join(dir, '.last-port');
|
||||
|
||||
@@ -84,6 +84,37 @@ else
|
||||
esac
|
||||
fi
|
||||
|
||||
# --- Test 2b: persistent sessions stop with explicit stopped metadata ---
|
||||
SESS="$(mktemp -d "$SCRIPT_DIR/.stop-persistent.XXXXXX")"; track_dir "$SESS"; mkdir -p "$SESS/content" "$SESS/state"
|
||||
SERVER_ID="$(new_server_id)"
|
||||
printf '%s\n' "$SERVER_ID" > "$SESS/state/server-instance-id"
|
||||
BRAINSTORM_DIR="$SESS" BRAINSTORM_PORT=0 node "$SERVER" "--brainstorm-server-id=$SERVER_ID" > /dev/null 2>&1 &
|
||||
SRV=$!
|
||||
track_pid "$SRV"
|
||||
disown "$SRV" 2>/dev/null || true
|
||||
for _ in $(seq 1 40); do
|
||||
[[ -f "$SESS/state/server-info" ]] && break
|
||||
sleep 0.1
|
||||
done
|
||||
echo "$SRV" > "$SESS/state/server.pid"
|
||||
OUT="$("$STOP" "$SESS")"
|
||||
sleep 0.3
|
||||
if kill -0 "$SRV" 2>/dev/null; then
|
||||
bad "persistent brainstorm server still running after stop" "$OUT"
|
||||
else
|
||||
wait "$SRV" 2>/dev/null || true
|
||||
untrack_pid "$SRV"
|
||||
if [[ -f "$SESS/state/server-info" ]]; then
|
||||
bad "persistent stop clears server-info" "server-info still exists after: $OUT"
|
||||
elif [[ ! -f "$SESS/state/server-stopped" ]]; then
|
||||
bad "persistent stop writes server-stopped" "server-stopped missing after: $OUT"
|
||||
elif grep -q '"reason":"stop-server.sh"' "$SESS/state/server-stopped"; then
|
||||
ok "persistent stop clears alive metadata and writes server-stopped"
|
||||
else
|
||||
bad "persistent stop writes stop reason" "$(cat "$SESS/state/server-stopped" 2>/dev/null || true)"
|
||||
fi
|
||||
fi
|
||||
|
||||
# --- Test 3: no pid file ---
|
||||
SESS="$(mktemp -d)"; track_dir "$SESS"; mkdir -p "$SESS/state"
|
||||
OUT="$("$STOP" "$SESS")"
|
||||
|
||||
Reference in New Issue
Block a user